我有一个令人头疼的问题,现在已经困扰了几天。
我在tomcat下部署了几个Web应用程序(7/8无关紧要,问题仍然存在),它们的交互使我头疼。
流程:
可以说我在同一 Tomcat 中部署了应用程序A和应用程序B。应用程序A接收外部HTTP请求R1,执行某项操作,然后在同一 Tomcat 上将另一个HTTP请求发送到应用程序B。发送请求后,Java Object.wait()方法将R1线程置于等待状态。
应用程序B接收应用程序A发送的请求R2,对其进行处理,然后将请求发送到应用程序A。
应用程序A接收请求R3,进行一些处理,然后再次向应用程序B发出请求R4(这是一种通知),并唤醒此时正在等待的线程处理R1。
X Req1 A B
|--------->| Req2 |
| |-------->|
| | Resp2 |
| |<........|
| | Req3 |
| |<--------|
| | Resp3 |
| |........>|
| | Req4 |
| |-------->|
| | Resp4 |
| Resp1 |<........|
|<.........| |
问题:
除了通知请求R4之外,其他一切都很好。该请求有时会挂起。当HTTP连接正在等待响应代码时,处理将卡住。 30秒后,请求超时后,应用程序B记录收到的请求,并返回ok。请求超时后,会立即发生这种情况。
仅当对同一tomcat中的应用程序B发出此请求R4时,才会发生挂起。如果应用程序B在其他服务器上运行,则该调用可以100%地运行。也是在此调用失败的地方。这不是实际的调用问题,因为我可以将通知调用更改为在同一位置进行任何其他调用,并且它会随机挂断。
有人可以阐明这个问题,并指出正确的方向吗?我的想法开始枯竭。
最佳答案
在这里写问题给了我一些新的想法,我开始扩大我的范围。
我也在Jetty上尝试过该案例,在给出相同的挂断后,我确定它确实在我的代码中。
事实证明,在将R4发送到应用程序B之前,应用程序A写入了R3的HttpServletResponse。
response.getWriter().println(responseContent);
response.getWriter().flush();
response.getWriter().close();
在这里,流的关闭是导致一切中断的原因。我删除了close()调用,现在R4请求正在按预期方式工作。
我不知道为什么关闭响应流会使下一个新的HTTP请求像以前那样挂起...