Транзакция и отправка электронного письма - PullRequest
5 голосов
/ 02 декабря 2010

Учитывая общий случай использования пользователем, создающим новую учетную запись в веб-приложении, и приложением, отправляющим электронное письмо с подтверждением на адрес пользователя.Из того, что я видел, это обычно реализуется одним из 3 способов:

  1. Веб-контроллер вызывает сервисный метод, который создает учетную запись пользователя и отправляет электронное письмо, как в рамках одной транзакции.
  2. Веб-контроллер вызывает метод службы (с tx распространением = никогда), который вызывает 1-й метод для самого себя, чтобы создать учетную запись пользователя в транзакции, а затем вызывает 2-й метод для себя, чтобы отправить электронное письмо.
  3. Веб-контроллер вызывает 1-й сервисный метод, который создает учетную запись пользователя в транзакции, а затем 2-й сервисный метод, который отправляет электронную почту.

1-й подход прост и понятен, но существует риск того, что транзакция будет отменена после отправки электронного письма, что сделает его недействительным.Второй подход более сложный, но он гарантирует, что электронное письмо будет отправлено только в том случае, если создание пользователя действительно завершилось успешно.Третий подход прост, но обременяет веб-уровень бизнес-логикой, которую он не должен знать.

Существует ли более простой подход, возможно, управляемый AOP, который гарантирует, что письмо будет отправлено толькоесли транзакция создания пользователя действительно удалась?Неужели я не уверен, что первый подход может потерпеть неудачу?

Мы используем стек Java EE + Spring и готовы интегрировать дополнительные API (AOP? Spring Integration?) Для достижения этой цели.

Ура!

Ответы [ 4 ]

6 голосов
/ 10 декабря 2010

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

http://download.oracle.com/javaee/6/api/javax/transaction/Synchronization.html

5 голосов
/ 02 декабря 2010

Для отправки электронных писем рекомендуется использовать Очередь и планировать отправку электронных писем каждые 5 или 15 минут. Очередь будет храниться в базе данных, поэтому в рамках транзакции. Затем запланируйте процедуру отправки электронной почты из этой очереди с регулярным интервалом.

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

0 голосов
/ 20 февраля 2013

Создание очереди с таблицей базы данных и запуск программы планирования с помощью Quartz или чего-то подобного, что было бы разумным и простым в реализации.

Также неплохо использовать RabbitMQ для разработки этих функций. RabbitMQ довольно прост в настройке и может использоваться в большинстве случаев для совместной работы между системами публикации / подписки, даже если вам может потребоваться реализация приложений уровня ack и небольших приложений, которые подписываются на сообщения из RabbitMQ и отправляют электронную почту через SMTP.

Это может звучать излишне, но вы можете использовать это решение № 2 для каждой системы, которая требует отправки электронной почты в будущем. Для этого вы все еще можете использовать модель, основанную на очереди базы данных, но для отправки электронной почты будете использовать дорогостоящий процессор / ресурсы базы данных.

0 голосов
/ 06 декабря 2010

Я бы добавил легкий слой JMS, такой как ActiveMQ, для электронной почты, он довольно прост в настройке и интегрируется (и даже встраивается) в Spring.Тогда у вас есть

1) Транзакция создания пользователя и отправка JMS-сообщения в одной транзакции.В случае сбоя любого из них вы все еще находитесь в хорошем состоянии (оба фиксируют или оба выполняют откат, и вы представляете пользователю ошибку)

2) Если потребитель JMS не может отправить электронное письмо, вы можете настроить очередь JMS наПовторите попытку несколько раз, и у вас будет лучшее решение для решения временных проблем с вашей системой электронной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...