2011-10-27 48 views
6

我正在寫一個servlet,它是在Java servlet容器(例如,JBoss,Jetty,Tomcat,GlassFish)中執行的。什麼時候servlet容器會中斷我的線程?

servlet容器中斷運行我的HTTP請求處理程序的線程的原因是什麼?只有在關閉時纔會這樣做嗎?當客戶端沒有響應時它會這樣做嗎?

它是標準化的,還是任何容器可以自由地做他想做的事情?

爲了澄清,我不是在談論中斷我創建的新線程,只是在我的請求正在運行的servlet容器的線程上。 (儘管如果你會提到答案中的新線程會發生什麼,這會很有趣)。

+1

爲了避免模棱兩可,當你說「線程」時,你真的*表示「HTTP請求」嗎? – BalusC

+0

好吧,從技術上講,它會中斷我的線程,並且當線程碰巧運行我的HTTP請求時它會發生。所以我不確定如何寫它。換句話說,希望它更好。 –

+0

如果您自己產生線程,場景會非常不同。所以你需要更清楚你的意思是什麼線程,它是如何創建的,以及它是否是一個守護線程,等等。 – BalusC

回答

1

什麼是servlet容器中斷運行我的HTTP請求處理程序的線程的原因?

這取決於容器本身。這在servlet規範中確實沒有標準化。

只有在關機時才這樣做嗎?

似乎最明顯的原因之一。本地測試告訴我至少Tomcat 7.0.22和Glassfish 3.1.1會立即中止所有servlet的處理,而不讓他們繼續執行任務。在這一點上不會有任何例外。

它會這樣做,當客戶端沒有響應?

只有當請求頭沒有完全到達時。在套接字連接上有一個容器特定的超時,通常是60秒。但是如果請求頭還沒有完全到達,那麼你的servlet方法將不會被輸入。只有當請求標題完全到達時,纔會輸入你的servlet方法。

然後,在servlet方法裏面;如果客戶端提供了一個請求主體(例如POST),並且你的servlet的代碼開始通過例如request.getParameter()request.getInputStream()讀取請求主體,那麼當客戶端在該點處中止發送請求主體時,它將拋出IOException。另一方面,當您寫入響應(並刷新/提交)時,當客戶端在此時終止連接時,也會拋出一個IOException。如有必要,你可以把它放在try-catch中,但是除了記錄之外,你不能再做任何事情。這些日誌記錄的用處非常可疑,並且可能只會使服務器日誌變得混亂。

+0

所以基本上,我可以忽略Servlet代碼中的InterruptedException,因爲它永遠不會發生? –

+0

是的。更重要的是,只有在您自己創建和管理線程的情況下,才能捕捉到它。 – BalusC

+0

我可以用'process.waitFor()'拋出它來捕捉它。 –

相關問題