【发布时间】:2020-12-07 00:09:24
【问题描述】:
我们实现了一个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"/>
提前致谢。
【问题讨论】:
标签: spring hibernate spring-transactions jta message-listener