我一直在捕捉到屬於亞種的SocketExceptions,例如破管或連接重置。問題是一旦他們被抓住,滑溜的混蛋應該怎麼做。什麼是一些常見的SocketExceptions以及導致它們的原因?
哪些人可能會愉快地忽略,哪些需要進一步關注?我正在查找不同的SocketExceptions及其原因的列表。
我一直在捕捉到屬於亞種的SocketExceptions,例如破管或連接重置。問題是一旦他們被抓住,滑溜的混蛋應該怎麼做。什麼是一些常見的SocketExceptions以及導致它們的原因?
哪些人可能會愉快地忽略,哪些需要進一步關注?我正在查找不同的SocketExceptions及其原因的列表。
在Java Web開發方面,一個破碎管或連接重置基本上意味着對方已經關閉了連接。在請求仍在運行時,客戶端按下Esc可能會導致這種情況,但請求仍在運行,或者在請求仍在運行時通過鏈接/書籤/地址欄導航。您經常在長時間運行的請求中看到此特定錯誤,例如大文件下載和不必要的大/慢業務任務(這對於不耐煩的用戶不好,大約3秒真是最大)。在極少數情況下,它也可能由硬件/網絡問題引起,如服務器或客戶端的網絡中斷。
當響應的輸出流上的flush()
或close()
被調用時,可以拋出此異常。你作爲服務器端無法對付它。由於HTTP中的安全限制,您無法(重新)連接客戶端,因此無法從中恢復。在大多數情況下,你也不應該嘗試,因爲這往往是客戶自己的決定。只需忽略它或將其記錄爲純粹的統計數據。
其他原因之一通常是操作系統上的TCP/IP堆棧設置。還沒有在Linux上嘗試過它,但我曾經工作過的一個平臺是Sun的Solaris 9/10操作系統。基本思想是Solaris具有可調諧的TCP/IP堆棧,您可以在運行Web應用程序時對其進行調整。
所以有兩個參數,你應該知道
所有上述參數的影響有多大負荷可製取(從TCP/IP的角度),並在另一面影響某些類型的發生SocketExceptions - 例如BalusC指出的那些。
這顯然是相當複雜的,但我試圖做的一點是,您經常託管您的應用程序的操作系統,爲您提供緩解策略。