我從http servlet調用了沉重而耗時的邏輯。請求超時會發生什麼? servlet容器會掛起底層http線程嗎?或者它會繼續運行?當請求超時時,http servlet會發生什麼?
回答
它會一直運行,不知道請求請求的客戶端可能已經過去了。
線程池
應用服務器通常擁有一個有界ThreadPool服務請求。這些池可用於每個Web應用程序,甚至可以作爲servlet/EJB的目標。當您長時間(或永久)運行線程時,它會使用線程池中的線程,並且在完成之前永遠不會返回該線程。這可能會導致線程池達到其最大大小,並最終降低對Web應用程序的調用性能。
還有一個無界線程池的概念,其中池可以使用的最大線程數僅受硬件限制。這對於服務器定義的「服務質量」屬性來說可能是個壞主意,因爲無界池會影響整個機器,而不僅僅是導致問題的WAR /代碼。
阻塞線程
某些應用程序服務器有規定,這種檢測和標記這樣的線程的STUCK。有JMX apis可以殺死線程,或者您可以釋放WAR以將線程釋放回池中。
超時
超時適用於HTTP層,而不適用於服務器端。你有不同的HTTP超時時間,比如。
- 連接超時 - 建立連接所用的時間。
- 讀取超時 - 由於客戶端花費太長時間來讀取響應而發生超時。
SO超時 - 整個操作的套接字超時。
該servlet不知道這些。當寫封閉連接時,您應該看到如下錯誤: - Connection close by remote host
想要避免所有這些嗎?編寫一個快速處理請求並儘快返回的servlet。這將保持高吞吐量和用戶的樂趣。
沒有這樣的事情,「SO超時 - 整個操作的套接字超時」。有連接超時和讀取超時,沒有別的。 – EJP 2013-04-12 00:07:48
@EJP在研究你的評論之後,我不得不重新定義我對基礎SO超時的理解。我一直認爲閱讀超時更細。我會編輯答案。謝謝。 – 2013-04-12 05:03:11
我希望通過'重新定義我的理解',你的意思是'檢查我的事實*而不是做出來'。這裏還有更多的發明。其餘的超時,實際存在的超時,處於TCP層,而不是HTTP層,它們適用於雙方。 「諸如」由遠程主機關閉的連接「之類的錯誤是你想象力的另一個瑕疵。我希望你的意思是'通過同行重置連接',但你總是可以第一時間做到。而關於線程池的整個題外話與它無關。 – EJP 2013-04-12 10:23:55
servlet線程仍在運行,因爲超時是客戶端行爲,唯一的影響是客戶端關閉請求的輸入流(servlet的輸出流),結果可能不會發送到客戶端。
我認爲超時是servlet容器特定的。一旦達到服務器通常會發送類似HTTP錯誤408請求超時。我不問當由於連接不通等原因發生超時時會發生什麼。 – adrift 2013-04-11 12:45:55
http請求超時由客戶端指定。 – BlackJoker 2013-04-11 12:48:09
- 1. 當在向ASP.NET MVC的AJAX請求中發生網絡請求超時時會發生什麼操作
- 2. HTTP請求超時
- 3. 當HTTP請求使用不同的瀏覽器頭時會發生什麼?
- 4. Android設備在發出http請求時發生超時錯誤
- 5. mule ce 3.7.0發送http請求時發生異常 - 超時(java.util.concurrent.TimeoutException)
- 6. 爲什麼NSURLConnection在發送很多請求時會超時?
- 7. HTTP,408請求超時
- 8. 大型資源創建請求超時時會發生什麼情況?
- 9. 路由發生變化時,爲什麼不發出HTTP請求?
- 10. 快遞Http請求超時
- 11. 當nginx + uwsgi + django中的響應超時時會發生什麼?
- 12. 當Heroku SQL查詢超時時會發生什麼?
- 13. 當發生超時時,SqlCommand.ExecuteXXX()會返回什麼錯誤號碼
- 14. Express.js HTTP請求超時
- 15. Http請求超時問題
- 16. http發佈請求中的Angular2超時
- 17. 中斷HTTP流時會發生什麼?
- 18. 超時http請求? Android
- 19. 去HTTP請求超時
- 20. 關閉輸出流後,servlet請求會發生什麼?
- 21. 在寫入快照複製時發生寫請求時會發生什麼?
- 22. 什麼時候servlet HTTP會話啓動?
- 23. 當從QueryPath訪問OpenAmplify時,我的HTTP請求失敗/超時。爲什麼?
- 24. 當我在鏈接上發送ajax請求時會發生什麼?
- 25. 請求超時 - 請求超時
- 26. 超時發出過多AFNetworking當請求
- 27. HTTP請求超載/超時使用python
- 28. 當localStorage已滿時會發生什麼?
- 29. 當redis重載時會發生什麼?
- 30. 當我ping 127.0.0.1時會發生什麼
我認爲它應該繼續運行。要嘗試一下,寫一個剛剛進入無限循環的HttpServlet。附上一個調試器來確定該線程發生了什麼。 – austin 2013-04-11 12:38:18