Разница между sessionTransacted и JmsTransactionManager

В чем основное различие между использованием sessionTransacted=true (в JmsTemplate и/или DefaultMessageListenerContainer) и используя JmsTransactionManager? Достаточно ли использования sessionTransacted=true для использования JmsTemplate и DefaultMessageListenerContainer? (мне не нужен ХА)

В документе сказано (в setSessionTransacted в JmsAccessor), и кажется, что это не должно быть проблемой:

Установка для этого флага значения «true» будет использовать короткую локальную транзакцию JMS при выполнении вне управляемой транзакции и синхронизированную локальную транзакцию JMS в случае присутствия управляемой транзакции (отличной от транзакции XA).


person Arya    schedule 23.05.2014    source источник


Ответы (2)


Верный.

На DefaultMessageListenerContainer(DMLC) обычно требуется только acknowledgemode=transacted; вы должны использовать диспетчер транзакций на DMLC только в том случае, если вам нужно синхронизировать транзакцию JMS, скажем, с транзакцией JDBC или вам нужно использовать диспетчер транзакций платформы (JTA).

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

Точно так же для операций JmsTemplate в потоке, который не является потоком-контейнером, вам обычно не нужен диспетчер транзакций, если только он не требуется платформой.

person Gary Russell    schedule 23.05.2014
comment
Спасибо Гэри. Используя JmsTransactionManager, можем ли мы быть уверены, что все jms-транзакции будут зафиксированы после jbdc-транзакций? - person Arya; 24.05.2014
comment
При синхронизации транзакций JMS и JDBC вы должны добавить диспетчер транзакций JDBC (не диспетчер tx JMS) в контейнер прослушивателя; диспетчер транзакций затем синхронизирует транзакции, фиксируя транзакцию БД непосредственно перед транзакцией JMS. Возможно, что фиксация JMS может завершиться ошибкой, поэтому вам нужно иметь дело с доставкой дублирующихся сообщений. - person Gary Russell; 24.05.2014

транзакция сеанса означает начало транзакции при запуске сеанса, завершение транзакции при завершении сеанса. Если вам нужен больший контроль над транзакцией, вам нужен JmsTransactionManager (локальный)

person Andrew    schedule 29.05.2015