2010-10-27 41 views
1

通過javamail發送郵件時,會打開一個到smtp服務器的套接字。現在,我們得到了這樣一個例子,即當連接仍然活着並且javamail正在等待服務器(垃圾郵件掃描需要幾秒鐘)時,郵件服務器的連接斷開。因此,TCP連接從未真正關閉,客戶端死鎖。Javamail在超時時沒有完全關閉套接字

因此,我們決定使用javamails超時,它的工作原理 - 客戶端在指定的時間後拋出異常。但是,tcp連接沒有正確關閉(netstat -np仍將連接顯示爲「ESTABLISHED」)。只有在我調用System.gc()後,套接字纔會關閉。

這是一個問題,因爲任何OOM,拋出異常之前GC()得到了保證,但不能達到FD-限制之前...

這個問題能以某種方式規避或者這是一個錯誤JavaMail的?

受影響的系統:Linux(Debian的萊尼),太陽JDK 1.6.0.20(與-XXUseSSE = 3),JavaMail的1.4.3

+0

讀取超時不一定是致命的。對於JavaMail來說,決定其他方式並關閉連接將是一個錯誤的特性。是你的決定。 – EJP 2014-05-04 07:36:35

+0

如果我指定超時,則庫將遵守此超時,取消讀取並返回異常。從java的角度來看,一切都很好。只有插座沒有關閉。只有在垃圾收集之後,套接字纔會被釋放。這意味着該庫缺少對「close()」的調用......我需要能夠保護系統資源並釋放套接字,即使沒有執行手動gc() - 特別是可能會禁用的gc()。 – 2014-05-18 20:32:39

回答

2

的異常不會導致連接被關閉,你必須調用Transport.close() 自己。