Откат JMS - PullRequest
       24

Откат JMS

8 голосов
/ 05 февраля 2009

У меня есть процесс, который включает в себя отправку сообщения JMS. Процесс является частью транзакции. Если более поздняя часть транзакции завершится неудачно, то есть после предыдущей части, которая отправила сообщение, мне нужно отменить сообщение. Одна мысль, которая у меня была, заключалась в том, чтобы каким-то образом установить сообщение, что оно не может быть принято в течение определенного периода времени, и, если мне понадобится откат, тогда я мог бы пойти и отменить сообщение. Не зная обмена сообщениями, я не знаю, возможна ли идея. Или есть идея получше? Спасибо

Ответы [ 2 ]

10 голосов
/ 16 февраля 2009

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

Например, если вы используете JMS с транзакциями XA, возможно следующее.

Start Transaction
      |
   DB Insert
      |
   Send JMS Msg
      |
   More DB Inserts
      | 
   Commit Transaction  <- Only at this point will the database records be inserted and the JMS message sent.

Транзакции XA доступны только в полных контейнерах Java EE, поэтому транзакции XA недоступны в Tomcat.

Удачи!

Karl

9 голосов
/ 06 февраля 2009

Вы можете использовать JMS и JTA (Java Transaction API) вместе - см. Здесь . При этом отправка сообщения JMS или использование полученного сообщения фактически происходит атомарно как часть фиксации транзакции.

Что это значит? Если транзакция завершается неудачно или откатывается, «отправленное» сообщение не исчезает, а любые «полученные» сообщения на самом деле не используются. Все они обрабатываются для вас вашим JMS и JTA провайдером.

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

У меня был опыт использования этого (BEA WebLogic 7 с BEA WebLogic Integration). Работал так, как рекламировалось - «внешний мир» не видел влияния JMS, который я пробовал, если транзакция не была успешно завершена.

...