[英]Tomcat Thread blocking for localhost connection
我有一個令人煩惱的困擾現在是一個日子。
我在tomcat下部署了幾個webapps(7/8沒關系,問題仍然存在),他們的交互讓我頭疼。
流程:
假設我將應用程序A和應用程序B部署在同一個tomcat中。 應用程序A接收外部http請求R1,做某事並在同一個tomcat上向應用程序B發送另一個http請求。 發送請求后,通過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 Connection等待響應代碼時,處理卡住。 在30秒后請求超時后,應用程序B記錄收到的請求並返回ok。 這在請求超時后立即發生。
只有當請求R4位於同一個tomcat中的應用程序B時,才會發生掛起。 如果應用程序B在某個其他服務器上運行,則該呼叫將100%運行。 它也只是這個呼叫失敗的地方。 這不是實際的呼叫問題,因為我可以將通知呼叫更改為在同一個地方進行任何其他呼叫,它會隨機掛斷。
有人可以對這個問題有所了解,並指出我正確的方向。 我開始沒有想法了。
在這里寫問題給了我一些新的想法,我開始擴大我的范圍。
我也用Jetty嘗試了這個案例,在它給出了相同的掛斷后我確信它在我的代碼中以某種方式。
原來是在R4發送到應用程序B之前,應用程序A寫入R3的HttpServletResponse。
response.getWriter().println(responseContent);
response.getWriter().flush();
response.getWriter().close();
在這里,流的關閉是導致一切都破裂的事情。 我刪除了close()調用,現在R4請求正常工作。
我不知道為什么關閉響應流會使下一個新的HTTP請求像它一樣掛起......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.