【问题标题】:Tomcat Thread blocking for localhost connection本地主机连接的Tomcat线程阻塞
【发布时间】:2023-04-09 11:28:01
【问题描述】:

我头疼了几天。

我在 tomcat 下部署了几个 webapp(7/8 无关紧要,问题仍然存在),它们的交互让我很头疼。

流程:

假设我将应用程序 A 和应用程序 B 部署在同一个 tomcat 中。应用程序 A 接收到外部 http 请求 R1,执行某些操作并将另一个 http 请求发送到同一 tomcat 上的应用程序 B。发送请求后,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 连接正在等待响应代码时,处理会卡住。请求在 30 秒后超时后,应用程序 B 记录收到的请求并返回 ok。这会在请求超时后立即发生。

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

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

【问题讨论】:

  • put to wait state by Java Object.wait(),您的意思是在 您的 代码中,您正在调用wait()?我们能看到这段代码吗?

标签: java multithreading tomcat


【解决方案1】:

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

我也用 Jetty 尝试过这个案例,在它给出了同样的挂断之后,我确信它以某种方式在我的代码中。

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

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

在这里,流的关闭是导致一切中断的原因。我删除了 close() 调用,现在 R4 请求正在正常工作。

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

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多