Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Nested exception  [new]
Molasar
Member

Откуда:
Сообщений: 773
Всем привет!

Для отправки email использую javax.mail. Внешний SMTP сервер через некоторое время рвёт соединение.
Ловлю exception:
javax.mail.MessagingException: Can't send command to SMTP host;
  nested exception is:
	java.net.SocketException: Обрыв канала (Write failed)

Как мне в блоке catch определить, что есть вложенное исключение java.net.SocketException?
После чего я буду соединятся с сервером снова.
4 июл 19, 18:22    [21921022]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
забыл ник
Member

Откуда:
Сообщений: 3038
Session s = //a JavaMail session I got from somewhere
boolean isConnected = s.getTransport("smtp").isConnected();

вот это и проверяй в блоке эксепшена а не вложенность исключений
4 июл 19, 18:27    [21921027]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
Molasar
Member

Откуда:
Сообщений: 773
Т.е. переменная connected будет равна false после выбрасывания исключения?

public synchronized boolean isConnected() {
      return connected;
}


забыл ник
Session s = //a JavaMail session I got from somewhere
boolean isConnected = s.getTransport("smtp").isConnected();

вот это и проверяй в блоке эксепшена а не вложенность исключений
4 июл 19, 18:38    [21921033]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
mayton
Member

Откуда: loopback
Сообщений: 42845
Molasar, у любого JavaException есть методы для движения вверх по стеку исключений.

https://docs.oracle.com/javaee/6/api/javax/mail/MessagingException.html

Но я убеждён что тебе это не нужно.
4 июл 19, 18:47    [21921043]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
Molasar
Как мне в блоке catch
а где ты привел этот блок?
4 июл 19, 18:48    [21921045]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
mayton
Но я убеждён что тебе это не нужно.
но пригодится)
4 июл 19, 18:50    [21921048]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
Molasar
Member

Откуда:
Сообщений: 773
@Override
    public void sendMessage(Message message) throws SenderException {
        if (transport != null) {
            try {               
                javax.mail.Message smtpMessage = new MimeMessage(smtpSession);

                smtpMessage.setFrom(...);
                smtpMessage.setRecipients(...);
                smtpMessage.setSubject(...);
                smtpMessage.setText(...);
                smtpMessage.saveChanges();

                transport.sendMessage(
                        smtpMessage,
                        smtpMessage.getAllRecipients());
    
            } catch (MessagingException ex) {
                if (!transport.isConnected()) {
                    try {
                        transport.close();
                    } catch (MessagingException ex1) {
                        throw new SenderException(
                                exceptionFailedCloseSMTP, ex1);
                    }
                    transport = null;
                    openSession(senderConfig);
                    sendMessage(message);
                }
            } 
        } else {
            throw new SenderException(exceptionSendWOSMTP);
        }
    }



PetroNotC Sharp
Molasar
Как мне в блоке catch
а где ты привел этот блок?
4 июл 19, 19:00    [21921055]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
mayton
Member

Откуда: loopback
Сообщений: 42845
PetroNotC Sharp
mayton
Но я убеждён что тебе это не нужно.
но пригодится)

С другой стороны. Он пишет дескыть... После чего я буду соединятся с сервером снова.
Отличная идея. А что есть кейс когда не надо соединятся? Какое вообще можно принять решение
по факту исключения? Расскажите мне господа хорошие. Какое?
4 июл 19, 19:12    [21921067]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
mayton,
Наверно есть кейс автопопытки как автодозвон на телефоне).
И есть кейс что письмо будет в статусе Не отправилось(
4 июл 19, 19:18    [21921070]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
mayton
Member

Откуда: loopback
Сообщений: 42845
Ну и пусть проверяет MessagingException. Зачем ему глубже копать?
4 июл 19, 19:21    [21921072]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
Molasar
} catch (MessagingException ex) {
после этой строки добавь метод
проверитьВложенное(ex);
Что внутри него выше дали ссылку.
4 июл 19, 19:22    [21921073]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
mayton
Ну и пусть проверяет MessagingException. Зачем ему глубже копать?
обычно там подробности (во вложенном). Все должны уметь их достать.
Я про это.
4 июл 19, 19:30    [21921075]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
mayton
Member

Откуда: loopback
Сообщений: 42845
                if (!transport.isConnected()) {
                    try {
                        transport.close();
                    } catch (MessagingException ex1) {
                        throw new SenderException(
                                exceptionFailedCloseSMTP, ex1);
                    }
                    transport = null;
                    openSession(senderConfig);
                    sendMessage(message);
                }

Еще более ужасно выглядит попытка повторной отправки. Это что. Типа с первого раза не затолкали.
А второй - точно-точно зайдет? Хорошо. А где третий рывок? И где для них всех обработка ошибки?
4 июл 19, 19:34    [21921077]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
mayton,
Да. Повтор я бы выше, делал. Это вроде как БЛ.
4 июл 19, 19:36    [21921079]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
mayton
Member

Откуда: loopback
Сообщений: 42845
do{
   ....
while(somethingWrong);

Почему сразу так не сделать?
4 июл 19, 19:41    [21921082]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
Molasar
Member

Откуда:
Сообщений: 773
Поэтому мне и важно обработать вложенное исключение, т.к. если с 1-й попытки письмо не отправилось по причине разрыва соединения SMTP сервером, то необходимо восстановить соединение и повторить отправку. В этом случае письмо точно уйдёт. Если конечно не будет другого исключения.
mayton
                if (!transport.isConnected()) {
                    try {
                        transport.close();
                    } catch (MessagingException ex1) {
                        throw new SenderException(
                                exceptionFailedCloseSMTP, ex1);
                    }
                    transport = null;
                    openSession(senderConfig);
                    sendMessage(message);
                }

Еще более ужасно выглядит попытка повторной отправки. Это что. Типа с первого раза не затолкали.
А второй - точно-точно зайдет? Хорошо. А где третий рывок? И где для них всех обработка ошибки?
4 июл 19, 20:14    [21921101]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
Molasar
по причине разрыва соединения SMTP сервером,
а если он надолго в ауте. Санкции)
4 июл 19, 20:26    [21921112]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
mayton
Member

Откуда: loopback
Сообщений: 42845
Да плевать. Пускай крутит бесконечные циклы. Кому от этого плохо? Ваш браузер за 5 минут сделает
больше запросов чем этот код за сутки.
5 июл 19, 00:05    [21921228]     Ответить | Цитировать Сообщить модератору
 Re: Nested exception  [new]
сладкий бубалех
Member

Откуда:
Сообщений: 40
может для реконнекта библиотекой воспользоваться?

https://github.com/jhalterman/failsafe
5 июл 19, 10:20    [21921381]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить