JTA и управление транзакциями в режиме гибернации

#spring #hibernate #spring-transactions #jta #message-listener

#spring #переход в режим гибернации #spring-транзакции #jta #прослушиватель сообщений

Вопрос:

Мы внедрили службу прослушивания сообщений spring, и основной операцией, предоставляемой этой службой, является обновление базы данных, управляемое несколькими событиями.

Контекст выглядит следующим образом.

    <bean id="consumerContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="concurrentConsumers" value="${jms.consumerContainer.concurrentconsumers}"/>
        <property name="maxConcurrentConsumers" value="${jms.consumerContainer.maxconcurrentconsumers}"/>
        <property name="errorHandler" ref="errorHandler" />
        <property name="connectionFactory" ref="jmsQueueConnectionFactory" />
        <property name="destination" ref="listenerQueue" />
        <property name="messageListener" ref="consumerContainer" />
        <property name="receiveTimeout" value="10000" />
        <property name="sessionTransacted" value="true" />
        <property name="transactionManager" ref="txManager" />
    </bean> 
  

TX manager находится в режиме гибернации.

 <tx:annotation-driven transaction-manager="txManager" />
<bean id="txManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory"/>
  

и аннотировал конкретный класс с помощью @Transactional.

Мы используем поддержку сервера приложений Jboss для интеграции с MQ через jndi. Проблема здесь в том, что если на каком-либо уровне прослушивателя возникает какое-либо исключение, общая транзакция не откатывается и сообщение не перемещается в очередь возврата. Очевидно, что, поскольку мы используем диспетчер транзакций в режиме гибернации, он не знает о других ресурсах, таких как транзакции JMS.

Могу ли я безопасно заменить это транзакцией JTA, поскольку Jboss будет обрабатывать общее управление транзакциями? Существует ли какой-либо предусмотренный риск при этом?

Я считаю, что больше не нужно аннотировать класс с помощью @Transactional, если мы используем JTA, как показано ниже.

 <bean id="jtatxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
  

Заранее спасибо.

Ответ №1:

Могу ли я безопасно заменить это транзакцией JTA, поскольку Jboss будет обрабатывать общее управление транзакциями?

Да, вы можете. Вам следует просто изменить свое определение bean txManager .

Я считаю, что больше не нужно аннотировать класс с помощью @Transactional .

Это неверно. Вам все еще нужно @Transactional . Это позволяет spring определять границу транзакции.

Комментарии:

1. Спасибо SternK. К сожалению, это привело к проблеме. Мы использовали время получения 1 мс, и JTA включила это свойство в действие, что привело к высокому MSU / MIPS в системе MF.