用于localhost连接的Tomcat线程阻塞

时间:2015-06-24 08:26:19

标签: java multithreading tomcat

我有一个令人困扰的困扰现在。

我在tomcat下部署了几个webapps(7/8没关系,问题仍然存在),他们的互动让我很头疼。

流程:

假设我在相同的tomcat中部署了应用程序A和应用程序B.应用程序A接收外部http请求R1,做某事并在同一个tomcat上向应用程序B发送另一个http请求。发送请求后,R1线程将被Java Object.wait()方法置于等待状态。

应用程序B接收应用程序A发送的请求R2,对其进行处理并向应用程序A发送请求。

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

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

问题:

除了通知请求R4之外,一切都很顺利。这个请求时不时地挂起。当HTTP Connection等待响应代码时,处理卡住。在30秒后请求超时后,应用程序B记录收到的请求并返回ok。这在请求超时后立即发生。

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

有人可以对这个问题有所了解并指出我正确的方向。我开始没有想法了。

1 个答案:

答案 0 :(得分:0)

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

我和Jetty一起尝试了这个案例,在它给出了相同的挂断后我确信它在我的代码中以某种方式。

原来是在R4发送到应用程序B之前,应用程序A写入R3的HttpServletResponse。

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

这里关闭的流是导致一切都破裂的事情。我删除了close()调用,现在R4请求正常工作。

我不知道为什么关闭响应流会让下一个新的HTTP请求像它一样挂起......