首页 > 解决方案 > JMS 消息重新传递不适用于 Spring + ActiveMQ + Atomikos + JTA + Tomcat 中的主题

问题描述

我在应用程序中有以下配置,它与队列完美配合,并在RuntimeException事务回滚按预期发生时重新传递消息。

但是相同的配置无法重新传递带有主题的消息并发出以下警告消息:

WARN  DefaultMessageListenerContainer - Setup of JMS message listener invoker failed for destination 'XXX_TOPIC' - trying to recover. Cause: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException: One or more resources refused to commit (possibly because of a timeout in the resource - see the log for details). This transaction has been rolled back instead.

配置:

<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
    <property name="brokerURL" value="tcp://localhost:61616"/>
    <!-- <property name="sendTimeout" value="1000"/> -->
    <property name="redeliveryPolicy" ref="redeliveryPolicy"/>
</bean>

<!-- Atomikos Connection Factory Wrapper For Gobal Tx -->
<bean id="queueConnectionFactoryBean" class="com.atomikos.jms.AtomikosConnectionFactoryBean">
    <property name="uniqueResourceName" value="amq1" />
    <property name="xaConnectionFactory" ref="amqConnectionFactory" />
</bean>

<bean id="jmsConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory">
        <ref bean="queueConnectionFactoryBean"/>
    </property>
    <property name="sessionCacheSize" value="20"/>
    <property name="cacheConsumers" value="false"/>
</bean>

<bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager">
        <bean class="com.atomikos.icatch.jta.UserTransactionManager"
                init-method="init"
                destroy-method="close">
            <property name="forceShutdown" value="false" />
        </bean>
    </property>
    <property name="userTransaction">
        <bean class="com.atomikos.icatch.jta.UserTransactionImp">
            <property name="transactionTimeout" value="300" />
        </bean>
    </property>
</bean> 

<!-- Topic configuration -->
<bean id="messageListener1" class="com.x.y.impl.JmsMessageListener"></bean>

<bean id="container1" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
    <property name="destinationName" value="XXX_TOPIC"/>
    <property name="messageListener" ref="messageListener1" />
    <property name="pubSubDomain" value="true" />
    <property name="transactionManager" ref="jtaTransactionManager" />
    <property name="concurrency" value="1" />
    <property name="receiveTimeout" value="3000" />

    <!-- For local session and Atomikos-->
    <property name="sessionTransacted" value="true"/>
</bean>

<!-- Bean configuration -->
<bean id="messageListener2" class="com.x.y.impl.JmsMessageListener"></bean>

<bean id="container2" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
    <property name="destinationName" value="XXX_QUEUE"/>
    <property name="messageListener" ref="messageListener2" />
    <property name="pubSubDomain" value="false" />
    <property name="transactionManager" ref="jtaTransactionManager" />
    <property name="concurrency" value="1" />

    <!-- For local session and Atomikos-->
    <property name="sessionTransacted" value="true"/>
</bean>

使用的 Spring 版本是 3.1、ActiveMQ 5.14、Atomikos 4.0.6。如果我错过了主题 DMLC 的任何配置,请告诉我。

标签: springjmsactivemqatomikos

解决方案


推荐阅读