2013-04-11 61 views
1

我從http servlet調用了沉重而耗時的邏輯。請求超時會發生什麼? servlet容器會掛起底層http線程嗎?或者它會繼續運行?當請求超時時,http servlet會發生什麼?

+0

我認爲它應該繼續運行。要嘗試一下,寫一個剛剛進入無限循環的HttpServlet。附上一個調試器來確定該線程發生了什麼。 – austin 2013-04-11 12:38:18

回答

1

它會一直運行,不知道請求請求的客戶端可能已經過去了。

線程池

應用服務器通常擁有一個有界ThreadPool服務請求。這些池可用於每個Web應用程序,甚至可以作爲servlet/EJB的目標。當您長時間(或永久)運行線程時,它會使用線程池中的線程,並且在完成之前永遠不會返回該線程。這可能會導致線程池達到其最大大小,並最終降低對Web應用程序的調用性能。

還有一個無界線程池的概念,其中池可以使用的最大線程數僅受硬件限制。這對於服務器定義的「服務質量」屬性來說可能是個壞主意,因爲無界池會影響整個機器,而不僅僅是導致問題的WAR /代碼。

阻塞線程

某些應用程序服務器有規定,這種檢測和標記這樣的線程的STUCK。有JMX apis可以殺死線程,或者您可以釋放WAR以將線程釋放回池中。

超時

超時適用於HTTP層,而不適用於服務器端。你有不同的HTTP超時時間,比如。

  • 連接超時 - 建立連接所用的時間。
  • 讀取超時 - 由於客戶端花費太長時間來讀取響應而發生超時。
  • SO超時 - 整個操作的套接字超時。

該servlet不知道這些。當寫封閉連接時,您應該看到如下錯誤: - Connection close by remote host

想要避免所有這些嗎?編寫一個快速處理請求並儘快返回的servlet。這將保持高吞吐量和用戶的樂趣。

+0

沒有這樣的事情,「SO超時 - 整個操作的套接字超時」。有連接超時和讀取超時,沒有別的。 – EJP 2013-04-12 00:07:48

+0

@EJP在研究你的評論之後,我不得不重新定義我對基礎SO超時的理解。我一直認爲閱讀超時更細。我會編輯答案。謝謝。 – 2013-04-12 05:03:11

+0

我希望通過'重新定義我的理解',你的意思是'檢查我的事實*而不是做出來'。這裏還有更多的發明。其餘的超時,實際存在的超時,處於TCP層,而不是HTTP層,它們適用於雙方。 「諸如」由遠程主機關閉的連接「之類的錯誤是你想象力的另一個瑕疵。我希望你的意思是'通過同行重置連接',但你總是可以第一時間做到。而關於線程池的整個題外話與它無關。 – EJP 2013-04-12 10:23:55

2

servlet線程仍在運行,因爲超時是客戶端行爲,唯一的影響是客戶端關閉請求的輸入流(servlet的輸出流),結果可能不會發送到客戶端。

+0

我認爲超時是servlet容器特定的。一旦達到服務器通常會發送類似HTTP錯誤408請求超時。我不問當由於連接不通等原因發生超時時會發生什麼。 – adrift 2013-04-11 12:45:55

+0

http請求超時由客戶端指定。 – BlackJoker 2013-04-11 12:48:09

相關問題