【问题标题】:JTA and Hibernate Transaction managementJTA 和 Hibernate 事务管理
【发布时间】: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


    【解决方案1】:

    我可以用 JTA 事务安全地替换它,因为 Jboss 将处理整体事务管理吗?

    是的,你can。你应该改变你的 bean txManager 定义。

    我相信它不再需要用 @Transactional 注释类。

    这不是真的。你仍然需要@Transactional。它允许spring识别事务boundary

    【讨论】:

    • 感谢 SternK。不幸的是,这遇到了一个问题。我们使用 1 毫秒的接收时间,而 JTA 启用了此属性,从而导致 MF 系统的 MSU/MIPS 较高。
    猜你喜欢
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2011-12-10
    • 2016-10-30
    • 1970-01-01
    相关资源
    最近更新 更多