我有一个令人头疼的问题,现在已经困扰了几天。

我在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请求像以前那样挂起...

10-06 02:50