2012-01-09 3 views
0

У меня есть многопоточное приложение (работает в контейнере сервлетов) с бэкэндом JPA/hibernate. Это приложение позволяет получать документы через простые URL-адреса. При первом загрузке документа (т. Е. Запрос на получение определенного URL-адреса) приложение должно отправить уведомление по электронной почте и пометить документ, полученный в базе данных.Как обеспечить одно действие в многопоточном приложении JPA

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

ответ

1

С отправкой по электронной почте не является транзакционным, я вижу две возможностей:

  • использования глобальной транзакции для обновления retrieaval статуса и SENS сообщения JMS, указывающее, что письмо должно быть отправлено. Оптимистический параллелизм должен быть активирован на объекте документа (с использованием поля @Version). Таким образом, если транзакция завершится неудачей из-за оптимистической проверки параллелизма, сообщение JMS не будет отправлено. Вам, конечно же, нужен слушатель JMS для отправки электронной почты по электронной почте при получении сообщения JMS.
  • используйте оптимистичную блокировку и отправляйте электронное сообщение из транзакции. Если транзакция завершилась неудачно из-за оптимистической блокировки, письмо не отправляется. Если это удастся, отправляется электронное письмо.

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

Смежные вопросы