2011-01-06 102 views
2

JavaMailを使用してPOP3サーバーに接続しています。しかしJavaMailのタイムアウト設定を正しく設定する方法

props.setProperty("mail.pop3.connectionpooltimeout", "3000"); 
props.setProperty("mail.pop3.connectiontimeout", "3000"); 
props.setProperty("mail.pop3.timeout", "3000"); 

、いくつかのケースでは、タイムアウトが正常に動作しますが、時々、JavaMailのフリーズ:電子メールサーバーが応答しない場合にJavaMailをlongに待機しませんように

はさらに、私は、次のプロパティを設定しました

DEBUG POP3: connecting to host "pop3.yahoo.com", port 110, isSSL false 

ポートまたはプロトコルの変更(SSL、TLS ..)は効果がありません。私はホストが単に存在しないと仮定します。

たとえば、の場合、pop.mail.yahoo.com(適切なホスト名)ではなくpop3.yahoo.comをポーリングすると、タイムアウト例外が発生するまで非常に長い時間待たなければなりません。 は数分後、私は次の例外を取得し、アプリケーションが実行し続け:

java.net.ConnectException: Operation timed out 

pop3.yahoo.comが存在するようだが応答しなくなります。

localhost:~ me$ ping pop3.yahoo.com 
PING pop3.yahoo.com (206.190.46.10): 56 data bytes 
Request timeout for icmp_seq 0 
Request timeout for icmp_seq 1 
Request timeout for icmp_seq 2 
Request timeout for icmp_seq 3 
^C 

をあなたは、なぜ尋ねるかもしれません私はpop.mail.yahoo.comの代わりにpop3.yahoo.comを使用します。 さて、アプリケーションのユーザーが間違ったホスト名を挿入した場合にどうなるかをテストしたかっただけです。

この問題は、このレポートhttp://www.opensubscriber.com/message/[email protected]/180946.htmlと関連していると思われます。電子メールサーバーが接続を閉じると問題が発生するというポスターが主張されています。 JavaMailはそれから非常に長い間待機しているようです(理由はわかりません)。

投稿されたリンクで問題が解決しなかったので、誰かがこれを修正するか、少なくともデバッグする方法を知っていますか?

は本当にありがとうございます

答えて

2

問題の原因が見つかりました。私のコードのバグだった。 Javamailはタイムアウト設定を尊重します。

0

おそらく、yahooはそのホストに向けられたすべてのパケットを黙って削除しています。これは厄介なことです。そうしないと、すぐにホストに到達できないか接続が拒否され、処理がはるかに簡単になるからです。 POP3を使用しているのではなく、POP3を使用していると仮定すると、すべて正しいように見えます。

私はAPIから、独自のSocketFactoryを提供することができます。ソケットパラメータをより詳細に制御し、ソケットが実際にJavaMailによって正しく作成されているかどうかをテストすることができます(SocketFactoryプロパティを設定しても動作しない場合は、その場所がわかります)。他のすべてが失敗した場合は、タイムアウトを設定する余分なスレッドを設定し、JavaMailスレッドが期限切れになるとスレッドを中断させることができます。もちろんこれはすべて回避策です。

また、接続がどのような状態であるかをnetstatで確認すると便利です。タイムアウトする場合はSYN_SENTにする必要があります。

+0

yahooが本当にすべてのパケットを静かにドロップすると、なぜJavamailはプロパティオブジェクトで提供したタイムアウト設定を尊重しないのですか?それは本当に奇妙です。 – Timo

+0

@valmarええ、JavaMailのバグのように見えますが、いくつかの特別なデバッグをしなくても、実際に知る方法はありません。 – wds

関連する問題