我有一个令人困扰的困扰现在。
我在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%运行。它也只是这个呼叫失败的地方。这不是实际的呼叫问题,因为我可以将通知呼叫更改为在同一个地方进行任何其他呼叫,它会随机挂断。
有人可以对这个问题有所了解并指出我正确的方向。我开始没有想法了。
答案 0 :(得分:0)
在这里写下问题给了我一些新的想法,我开始扩大我的范围。
我和Jetty一起尝试了这个案例,在它给出了相同的挂断后我确信它在我的代码中以某种方式。
原来是在R4发送到应用程序B之前,应用程序A写入R3的HttpServletResponse。
response.getWriter().println(responseContent);
response.getWriter().flush();
response.getWriter().close();
这里关闭的流是导致一切都破裂的事情。我删除了close()调用,现在R4请求正常工作。
我不知道为什么关闭响应流会让下一个新的HTTP请求像它一样挂起......