javamail 経由でメールを送信すると、smtp サーバーへのソケットが開かれます。ここで、接続がまだ生きていて、javamail がサーバーを待っている間に、メール サーバーの接続がダウンしたというケースがありました (スパム スキャンに数秒かかりました)。そのため、TCP 接続が実際に閉じられることはなく、クライアントはデッドロック状態になりました。
そこで、javamails タイムアウトを使用することにしました。これは機能します。クライアントは、指定された時間の後に例外をスローします。ただし、tcp 接続は正しく閉じられません (netstat -np では、接続が「ESTABLISHED」と表示されます)。System.gc() を呼び出した後でのみ、ソケットが閉じられます。
gc() は OOM-Exception がスローされる前に保証されますが、FD 制限に達する前には保証されないため、これは問題です...
これは何とか回避できますか、それとも javamail のバグですか?
影響を受けるシステム: Linux (debian lenny)、Sun JDK 1.6.0.20 (-XXUseSSE=3)、javamail 1.4.3