2015-07-09 5 views
0

У меня странное поведение, когда мое приложение пытается отправить электронное письмо.java.net.SocketException: Broken pipe with SMTP

20:59:08,926 ERROR [release.com.mycompany.mail.GenericMail] (EJB default - 5) [MY_EJB INBOUND] Sending message failed!: javax.mail.MessagingException: Can't send command to SMTP host; 
    nested exception is: 
    java.net.SocketException: Broken pipe 
    at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:2106) [mail-1.4.4-redhat-2.jar:1.4.4-redhat-2] 
    at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:2093) [mail-1.4.4-redhat-2.jar:1.4.4-redhat-2] 
    at com.sun.mail.smtp.SMTPTransport.close(SMTPTransport.java:1184) [mail-1.4.4-redhat-2.jar:1.4.4-redhat-2] 
    at javax.mail.Transport.send0(Transport.java:197) [mail-1.4.4-redhat-2.jar:1.4.4-redhat-2] 
    at javax.mail.Transport.send(Transport.java:124) [mail-1.4.4-redhat-2.jar:1.4.4-redhat-2] 
    at com.mycompany.MailUtils.sendMail(MailUtils.java:258) [classes:] 

До этого исключения было выброшено некоторое исключение тайм-аут:

20:57:50,291 ERROR [org.jboss.as.ejb3] (EJB default - 9) [ ] JBAS014122: Error during 
retrying timeout for timer: [id=6be904b5-c1ef-4f0e-a277-d4c9f93e21b3 timedObjectId=SOME_EJB 
auto-timer?:false persistent?:false [email protected]dab1 initialExpiration=/* date */ 00:00:00 UTC 2015 intervalDuration(in milli sec)=0 nextExpiration=/* other date */ 21:00:00 UTC 2015 
timerState=RETRY_TIMEOUT: javax.ejb.EJBTransactionRolledbackException: JBAS014373: 
EJB 3.1 PFD2 4.8.5.5.1 concurrent access timeout on [email protected] - could not obtain lock within 5000MILLISECONDS 

Честно говоря, я не знаю, Что случилось. Я получил такое исключение в течение 5 часов. Я хочу знать, что произошло, и уметь избежать исключений в будущем.

UPDATE 1

SOME_EJB является EJB с работами с timerService. Работает каждые 3 минуты, когда условия выполняются, отправляет электронное письмо.

Моя единственная идея заключается в том, что была проблема с сетью/базой данных, и это вызвало то, что одно выполнение задачи заняло более 3 минут.

MailUtils является @Stateless EJB

ответ

0

послали почту или нет?

Похоже, что JavaMail закрывает соединение с почтовым сервером при возникновении исключения. Если предыдущая ошибка заставила сервер немедленно удалить соединение, JavaMail может получить это исключение, пытаясь отправить команду SMTP BYE перед закрытием соединения.

Включите JavaMail Session debugging, чтобы узнать, какая ошибка сервер мог сообщить до возникновения этого исключения.

+0

Mail не отправлен. К сожалению, включение debug не является решением для меня, потому что я не знаю, как воспроизвести это поведение. Также см. Обновление моего сообщения. –

+0

Вы можете использовать Session.setDebugOut для перенаправления вывода отладки в файл, затем отбросить файл на успех и сохранить его для последующей отладки при сбое. Без дополнительной информации все, что вы можете предположить, это то, что сервер или сеть потерпели неудачу, и вам нужно повторить операцию. –