LINUX.ORG.RU

Зависают треды на посылке почты

 hangs, , ,


0

1

Сегодня перестала отправлятся почта с сервера. Проблема оказалась в том что fixed thread pool оказался забит задачами, причем текущие активные задачи просто зависли на методе java.net.SocketInputStream.socketRead0(и висели судя по логам уже 20 часов).

Есть подозрение что была проблема с сетью и сокеты позависали при создании соединения.

Наблюдал подобное на другом проекте, тогда пытались пофиксить это установкой setKeepAlive, после этого проблема не наблюдалась, но т.к. проблема воспроизводится редко и сложно(простое отключение сети не помогает, сокет коректно валится), не могу утверждать что именно это помогло.

Stacktrace:

java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:152)
java.net.SocketInputStream.read(SocketInputStream.java:122)
sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
sun.security.ssl.InputRecord.readV3Record(InputRecord.java:554)
sun.security.ssl.InputRecord.read(InputRecord.java:509)
sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:507)
com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1900)
com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638)
javax.mail.Service.connect(Service.java:295)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)

Может кто сталкивался и успешно решил эту проблему, а то в интернете в основном советуют перезагрузить JVM или закрыть сокет(к которому, по понятным причинам доступа нет).


Может, я не очень понимаю, в чём проблема, но я бы лучше поставил таймаут для сокета, а задачи с определённой периодичностью пересоздавал.

GblGbl ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.