2009-02-05 5 views
7

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

ответ

7

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

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

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

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

8

То, что вы описали, является транзакцией 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 Tranactions доступны только в полных контейнеров Java EE так XA транзакции не доступны в Tomcat.

Удачи вам!

Карл

+0

Также примите во внимание потери производительности: http://stackoverflow.com/questions/12305900/performance-overhead-of-xa-data-sources-best-practices – Vadzim