【发布时间】: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