问题描述
我们已经实现了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管理器处于休眠状态。
<tx:annotation-driven transaction-manager="txManager" />
<bean id="txManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory"/>
并用@Transactional注释具体的类。
我们使用Jboss应用服务器支持通过jndi与MQ集成。 这里的问题是,如果侦听器中的任何层存在任何异常,则不会回滚整个事务,并且消息也不会移回退出队列。显然,当我们使用Hibernate事务管理器时,它并不了解其他资源,例如JMS事务。
我可以用JTA事务安全地替换它吗,因为Jboss将处理整个事务管理?这样做有预见的风险吗?
我相信,如果我们按以下方式使用JTA,则不再需要使用@Transactional对该类进行注释。
<bean id="jtatxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
谢谢。