博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Servlet返回响应和执行业务逻辑代码分开

Posted on 2015-05-03 11:56  周星-江财的  阅读(482)  评论(0)    收藏  举报
有一个程序A通过url调用Servlet,如果响应不成功(比如程序里访问url的时候产生网络问题、超时等等情况)就再调用一次。 
应用中出现这种情况:程序A实际第一次就调用成功了Servlet的url,但是由于Servlet内部程序执行时间太长,迟迟没有给程序A响应,造成程序A以为没有成功,又重复调用了一次url。结果是调用了两次,重复了。 
现在想去掉这种重复,有两个思路: 
思路1、程序A通过url调用Servlet时立刻返回正确响应,告诉程序A已经成功访问Servlet了,不需要再重复调用了。Servlet这边自己负责自己的代码是否执行成功,就是虽然告诉程序A调用成功了,但Servlet执行过程中还有可能出现问题,不过跟程序A已经没有关系了。我通过直接关闭response实现这个思路 
Java代码  收藏代码
  1. Servlet{  
  2.   doGet(){  
  3.          response.setHeader("Content-type""text/html;charset=UTF-8");  
  4.          response.setCharacterEncoding("utf-8");  
  5.     PrintWriter out = response.getWriter();  
  6.               
  7.     out.println("OK" );  
  8.     out.flush();  
  9.     out.close();  
  10.            
  11.          ...其他程序...  
  12.   }  
  13. }  

这样只要访问这个Servlet的网络是正常的,程序A调用这个url基本就不会出问题,也就避免了重复发送的问题。但是Servlet内部如果出错了程序A也就不知道了,需要Servlet自己来做错误处理。 

思路2、在Servlet里面可以用集合做一个缓存,调用一次记录一个request带的参数,这样如果重复调用的话就匹配这个集合,如果集合中存在参数就不执行了。 
再开启一个线程,用线程去处理Servlet里的业务功能,Servlet自身只需要返回正确响应就可以了。 
这样的话程序A调用Servlet的url应该也不会有问题,因为业务逻辑被另一个线程处理,出了问题不影响Servlet,也就不影响程序A的响应了。