How to properly set JavaMail timeout setting
I am using JavaMail to connect to a POP3 server.
Further, I set the following properties, so that JavaMail won't wait to long if an email server doesn't respond:
props.setProperty("mail.pop3.connectionpooltimeout", "3000");
props.setProperty("mail.pop3.connectiontimeout", "3000");
props.setProperty("mail.pop3.timeout", "3000");
However, in some cases the timeout works properly but sometimes JavaMail freezes for minutes(!) with the following debug message:
DEBUG POP3: connecting to host "pop3.yahoo.com", port 110, isSSL false
Changing ports or protocols (SSL, TLS..) has no effect. I assume that the host simply doesn't exist.
For example, if I poll pop3.yahoo.com instead of pop.mail.yahoo.co开发者_如何转开发m (which would be the right host name), I have to wait very long til a timeout exception occurs. After several minutes, I get the following exception and the application continues to run:
java.net.ConnectException: Operation timed out
pop3.yahoo.com seems to exist but won't respond:
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
You might be asking why I use pop3.yahoo.com instead of pop.mail.yahoo.com. Well, I simply wanted to test what happens if the user of my application inserts a wrong host name.
I believe that this issue is related to this report http://www.opensubscriber.com/message/javamail-interest@java.sun.com/180946.html where the poster claims that the problem occurs if the email server closes the connection. JavaMail then seems to wait very long (don't know why).
Since the issue wasn't resolved in the link I posted: Does somebody know how to fix or at least debug this?
Any help would be really appreciated!
I found the reason for the problem. It was a bug in my code. Javamail respects the timeout setting fine.
Most likely, yahoo is silently dropping all packets directed at that host. This is a tad annoying, because otherwise you'd immediately get back host unreachable or connection refused, which would be much easier to handle. Everything looks correct though, assuming you're using POP3 and not POP3S.
I see from the API that you can provide your own SocketFactory
. Doing that you'd have greater control over the socket parameters, and you can test whether the socket is really being created correctly by JavaMail (if setting the SocketFactory
property doesn't work, you know that's where to look). If all else fails, you could set up an extra thread that sets a timeout and interrupts the JavaMail thread when it expires. This is all workaround stuff of course.
It would also be helpful to check with netstat what state the connection is in. If it's going to timeout it should be in SYN_SENT.
精彩评论