Как правильно установить время ожидания JavaMail - PullRequest
2 голосов
/ 07 января 2011

Я использую JavaMail для подключения к серверу POP3.

Далее, я установил следующие свойства, чтобы JavaMail долго не ждал, если почтовый сервер не отвечает:

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

Однако в некоторых случаях тайм-аут работает правильно, но иногда JavaMail зависает на минуты (!) Со следующим сообщением отладки:

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

Изменение портов или протоколов (SSL, TLS ..) не имеет никакого эффекта. Я предполагаю, что хост просто не существует.

Например, , если я опрошу pop3.yahoo.com вместо pop.mail.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

Вы можете спросить, почему я использую pop3.yahoo.com вместо pop.mail.yahoo.com. Я просто хотел проверить, что произойдет, если пользователь моего приложения введет неправильное имя хоста.

Я считаю, что эта проблема связана с этим отчетом http://www.opensubscriber.com/message/javamail-interest@java.sun.com/180946.html, где автор утверждает, что проблема возникает, если почтовый сервер закрывает соединение. JavaMail, кажется, ждет очень долго (не знаю почему).

Поскольку проблема не была решена по ссылке, которую я разместил: кто-нибудь знает, как это исправить или хотя бы отладить?

Любая помощь будет очень ценится !

Ответы [ 2 ]

2 голосов
/ 11 января 2011

Я нашел причину проблемы.Это была ошибка в моем коде.Javamail соблюдает настройку тайм-аута в порядке.

0 голосов
/ 07 января 2011

Скорее всего, Yahoo молча отбрасывает все пакеты, направленные на этот хост. Это немного раздражает, потому что в противном случае вы бы сразу же вернули хост, недоступный или отказавший в соединении, что было бы намного легче обрабатывать. Хотя все выглядит правильно, если вы используете POP3, а не POP3S.

Я вижу из API, что вы можете предоставить свой SocketFactory. Сделав это, вы получите больший контроль над параметрами сокета, и вы сможете проверить, действительно ли сокет действительно создается JavaMail (если настройка свойства SocketFactory не работает, вы знаете, где искать). Если все остальное терпит неудачу, вы могли бы установить дополнительный поток, который устанавливает время ожидания и прерывает поток JavaMail, когда он истекает. Это все обходные пути, конечно.

Также было бы полезно проверить с помощью netstat, в каком состоянии находится соединение. Если время ожидания истекло, оно должно быть в SYN_SENT.

...