Подтвердите транзакцию и отправьте письмо - PullRequest
0 голосов
/ 08 июня 2011

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

Таким образом,

try {
    transaction.begin()
    ...
    transaction.commit()
    // point 1
    Utility.sendEmail(...)
} catch (Exception e) {
    transaction.rollback();
}

Возможно ли, что поток умирает / погибает в точке 1 и не отправляет электронное письмо? Есть ли способ минимизировать это? JTA + JMS, возможно, где действие отправки сообщения является частью транзакции? Я исследую проблему и изучаю, возможно ли это. JVM все еще жива (нет OOM). Я не знаю внутреннюю работу сервера приложений, поэтому не уверен, возможно ли это.

1 Ответ

1 голос
/ 08 июня 2011

Я не могу точно сказать, имеет ли откат () в предложении catch какое-либо влияние, если commit () был в порядке, и sendEmail () выдал исключение.Самый быстрый способ проверить это - сгенерировать исключение из метода sendEmail () и посмотреть, была ли транзакция на самом деле зафиксирована.

Хотя я бы сказал, что это - отодвинуть вызов sendEmail () отваш блок try:

try {
    transaction.begin()
    ...
    transaction.commit()
} catch (Exception e) {
    transaction.rollback();
}

try {
    // point 1
    Utility.sendEmail(...)
} catch (Exception e) {
    // handle it
}

Таким образом, вы можете контролировать, что произойдет, если был выполнен откат.

Кроме того, я думаю, что отправка электронного письма в очередь JMS в большинстве случаевотличная идея.Если вы сделаете это, вы получите разрешение на код БД для продолжения и, возможно, дадите обратную связь вашему пользователю, что все прошло нормально, и электронное письмо будет отправлено, когда оно соответствует расписанию контроллера электронной почты.Например, может быть проблема с соединением с вашим почтовым сервером, и отправка электронной почты будет зависать, скажем, на 30 секунд, прежде чем выдать исключение, и ваш пользователь увидит это как очень длинный щелчок кнопки.

...