我有一个一直困扰了一段时间的头部划痕器。Tomcat线程阻塞用于本地主机连接
我有几个webapps部署在tomcat下(7/8无所谓,问题依然存在),他们的交互使我头痛。
流量:
可以说我有一个应用程序,并部署在同一Tomcat应用B。应用程序A接收一个外部http请求R1,执行某些操作,并向另一个tomcat上的应用程序B发送另一个http请求。发送请求后,通过Java Object.wait()方法将R1线程置于等待状态。
应用B接收由R2应用A发送请求,处理它,发送给应用程序A的请求
应用A接收请求R3,进行一些处理,并再次(这使得请求R4至应用程序B是一种通知),并唤醒处理R1的线程,此时正在等待。
X Req1 A B
|--------->| Req2 |
| |-------->|
| | Resp2 |
| |<........|
| | Req3 |
| |<--------|
| | Resp3 |
| |........>|
| | Req4 |
| |-------->|
| | Resp4 |
| Resp1 |<........|
|<.........| |
问题:
一切顺利除与通知请求R4。此请求每隔一段时间都会挂起。 HTTP连接正在等待响应代码时,处理卡住了。在30秒后请求超时后,应用程序B记录收到的请求并返回OK。这在请求超时后立即发生。
只有当这个请求R4被提交给位于同一个tomcat中的应用程序B时,挂起才会发生。如果应用程序B在某个其他服务器上运行,则该调用将工作100%。这也只是这个呼叫失败的地方。这不是实际的呼叫问题,因为我可以将通知呼叫更改为在同一地点进行任何其他呼叫,并且它会随机挂断。
有人可以解释一下这个问题,并指出我正确的方向。我开始用尽想法。
通过'把被Java的Object.wait()'等待状态,你的意思在*你的*代码中,你调用了'wait()'?我们可以看到这个代码吗? – artbristol