簡體   English   中英

Tomcat線程阻塞localhost連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM