邪恶暴走漫画 - 骂人短信 - 热门标签 骂人网(marenw.Com)主要提供骂人图片、话顺口溜、骂人宝典、骂人不带脏字等精彩内容!
当前位置:主页 > 骂人的话 > 正文

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

时间:2015-11-25 10:49 作者:admin 阅读:
Servlet返回响应和执行营业逻辑代码分隔可行吗

用户提出问题:Servlet返回响应和执行业务逻辑代码分隔隔离分散可行吗,详细如下:有一个程序A通过url调用Servlet,如果响应不成功(好比程序里接见url的时刻发生网络问题、超时等等情况)就再调用一次。
应用中呈现这种情形:程序A现实第一次就调用乐成了Servlet的url,可是因为Servlet内部程序执行时候太长,迟迟没有给程序A响应,造成程序A觉得没有成功,又重复调用了一次url。成果是调用了两次,重复了。
此刻想去失落这种重复,有两个思路:
思路1、程序A经由过程url调用Servlet时马上返回准确响应,告诉程序A已经成功会见Servlet了,不需要再重复调用了。Servlet这边自己卖力自己的代码是否执行成功,就是固然告诉程序A调用成功了,但Servlet执行过程中还有可能泛起问题,不外跟程序A已经没有关系了。我通过直接封闭response实现这个思路

Servlet{  doGet(){         response.setHeader("Content-type", "text/html;charset=UTF-8");         response.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();out.println("OK" );out.flush();out.close();                  ...其他程序...  }}

如许只要拜候这个Servlet的收集是正常的,法式A挪用这个url根基就不会出问题,也就制止了反复发送的问题。可是Servlet内部假如犯错了法式A也就不知道了,需要Servlet本身来做错误处置。

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

我的设法是若是第一种方式可行,那就没需要再开启一个线程了。由于Servlet在Tomcat中也是由Tomcat开启多个线程的,归正思绪1已经给调用Servlet的程序A返回准确响应了,在Tomcat开启的一个Servlet线程中处置惩罚营业逻辑也就不会影响上级挪用程序了,以是思绪1可以更简朴实现需求的功效。

不知我是否形貌清晰了?我的设法主意是否可行?建议用思路1照旧2呢?
再求证一个工作:程序内部通过url调用Servlet时,Servlet在什么情形下返回响应,是在Servlet所有代码执行完吗?照样在response的输出流关闭的时辰?如果跟容器有关,那么我想知道Tomcat的实现。



问题弥补:wjddnl 写道

通过互联网清算获得以下解决方法:

=================1楼=====================

若是必然要用线程  那就用线程池吧  节制线程的数目  然则如果这个操作历程很是慢 可以导致线程池堵塞的话 那仍是用行列吧  最靠谱的要领

=================2楼=====================

启动线程意味着 没一个请求都发生别的一个新线程 办事器开销极度年夜 如果你手上的服务器很好 并且请求量并不大 那你可以试一下  不外这种环境下 最好就是异队伍列,ActiveMQ 很简单 半天就能学会

=================3楼=====================

利用异队伍列,JMS动静机制去向理吧 
(点小图检察大图)

如果您另有更好的解决方法,请在最下面谈论中留下您的解决方式

顶一下
(1)
50%
踩一下
(1)
50%