Одной из идей является использование JMS в качестве «движка», и вы можете использовать JMS-транзакции (которые могут присоединяться к существующим транзакциям, например, к транзакциям БД). Это начинает приводить к асинхронной архитектуре, управляемой событиями, что, вероятно, хорошо, если мы не говорим о простых приложениях - в этом случае вам, вероятно, не нужно задавать вопрос.
Примером этого может быть простое создание учетной записи. Для этого вы хотите сохранить данные учетной записи в БД, а также отправить пользователю электронное письмо для активации - но вы хотите, чтобы они были в той же транзакции по очевидным причинам.
Вы не должны помещать код отправки электронной почты в транзакцию, потому что даже если вы можете отправить электронное письмо - фиксация транзакции db может произойти по той или иной причине.
Вам также не следует помещать отправку электронной почты за пределы транзакции (после принятия), так как отправка электронной почты может завершиться неудачно, что приведет к созданию бесхозной учетной записи.
Итак, чтобы использовать JMS в этом сценарии - поместите код отправки JMS в транзакцию БД и попросите его присоединиться к этой транзакции. Вам гарантирована доставка сообщений. На другом конце есть что-то, потребляющее очередь отправки электронных писем. В случае сбоя при отправке электронной почты, лучший вариант - записать / подать предупреждение - JMS откатится и поместит сообщение обратно в очередь для последующего использования. то есть попытаться переслать письмо, как только вы, надеюсь, исправите проблему.
Критическая вещь - запись в БД непротиворечива, и электронная почта в конечном итоге отправляется.