2015-06-24 34 views
3

我有一个一直困扰了一段时间的头部划痕器。Tomcat线程阻塞用于本地主机连接

我有几个webapps部署在tomcat下(7/8无所谓,问题依然存在),他们的交互使我头痛。

流量:

可以说我有一个应用程序,并部署在同一Tomcat应用B。应用程序A接收一个外部http请求R1,执行某些操作,并向另一个tomcat上的应用程序B发送另一个http请求。发送请求后,通过Java Object.wait()方法将R1线程置于等待状态。

应用B接收由R2应用A发送请求,处理它,发送给应用程序A的请求

应用A接收请求R3,进行一些处理,并再次(这使得请求R4至应用程序B是一种通知),并唤醒处理R1的线程,此时正在等待。

X Req1 A   B 
|--------->| Req2 | 
|   |-------->| 
|   | Resp2 | 
|   |<........| 
|   | Req3 | 
|   |<--------| 
|   | Resp3 | 
|   |........>| 
|   | Req4 | 
|   |-------->| 
|   | Resp4 | 
| Resp1 |<........| 
|<.........|   | 

问题:

一切顺利除与通知请求R4。此请求每隔一段时间都会挂起。 HTTP连接正在等待响应代码时,处理卡住了。在30秒后请求超时后,应用程序B记录收到的请求并返回OK。这在请求超时后立即发生。

只有当这个请求R4被提交给位于同一个tomcat中的应用程序B时,挂起才会发生。如果应用程序B在某个其他服务器上运行,则该调用将工作100%。这也只是这个呼叫失败的地方。这不是实际的呼叫问题,因为我可以将通知呼叫更改为在同一地点进行任何其他呼叫,并且它会随机挂断。

有人可以解释一下这个问题,并指出我正确的方向。我开始用尽想法。

+0

通过'把被Java的Object.wait()'等待状态,你的意思在*你的*代码中,你调用了'wait()'?我们可以看到这个代码吗? – artbristol

回答

0

写这个问题给了我一些新的想法,我开始扩大我的范围。

我试过这种情况也与Jetty和它给了同样的挂断我确定它在我的代码莫名其妙。

结果发现,在R4发送给应用程序B之前,应用程序A将写入R3的HttpServletResponse。

response.getWriter().println(responseContent); 
response.getWriter().flush(); 
response.getWriter().close(); 

在这里关闭的流是导致一切破裂的东西。我删除了close()调用,现在R4请求正在运行。

我不知道为什么一个响应流的结束将使下一个新的HTTP请求挂像它那样...