Как обеспечить одно действие в многопоточном приложении JPA - PullRequest
0 голосов
/ 09 января 2012

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

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

1 Ответ

1 голос
/ 09 января 2012

Поскольку отправка электронного письма не является транзакционной, я вижу две возможности:

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

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

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