【问题标题】:JMS Message consumed despite transaction rollback尽管事务回滚,但仍使用 JMS 消息
【发布时间】:2015-11-18 01:08:22
【问题描述】:

我有一个简单的 XA 测试设置,使用 JMS 和 JDBC。我使用 Atomikos 3.9.3、ActiveMQ 5.10.1 和 DB2 及其适当的 XA 驱动程序。

发送消息工作正常,它是事务性的。但是消费案例没有 - 尽管抛出了异常,但 JMS 消息被消费了。

奇怪的是,它似乎与时间有关——通常是事务第一次回滚时,消息仍然存在——但随后尝试从队列中消费消息的一次尝试是成功的。

这是我使用消息的 spring 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"     xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation=" http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop     http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx     http://www.springframework.org/schema/tx/spring-tx-2.0.xsd     http://www.springframework.org/schema/jms     http://www.springframework.org/schema/jms/spring-jms.xsd">

<bean id="xaConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
    <constructor-arg value="mulejms" />
    <constructor-arg value="mulejms" />
    <constructor-arg value="tcp://localhost:61616" />
</bean>

<bean id="atomikosConnectionFactoryBean" class="com.atomikos.jms.AtomikosConnectionFactoryBean"
    init-method="init" destroy-method="close">
    <property name="uniqueResourceName" value="amq1" />
    <property name="xaConnectionFactory" ref="xaConnectionFactory" />
</bean>


<bean id="msgHandler" class="com.findonnet.messaging.MessageHandlerImpl">
    <property name="sequenceDAO" ref="sequenceDAO" />
</bean>

<!-- End Messaging related beans -->


<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
    init-method="init" destroy-method="close">
    <property name="uniqueResourceName" value="DB2" />
    <property name="xaDataSource" ref="db2DataSource" />
</bean>


<bean id="db2DataSource" class="com.ibm.db2.jcc.DB2XADataSource">
    <property name="serverName" value="localhost" />
    <property name="portNumber" value="50000" />
    <property name="databaseName" value="HWEXT" />
    <property name="driverType" value="4" />
    <property name="user" value="hwextdev" />
    <property name="password" value="hwextdev" />
</bean>



<!-- ===================================================== -->
<!-- ==== TRANSACTION MANAGER CONFIG ===================== -->
<!-- ===================================================== -->


<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
    init-method="init" destroy-method="close">
    <property name="forceShutdown" value="true" />
</bean>

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" />

<bean id="transactionManager"
    class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager" ref="atomikosTransactionManager" />
    <property name="userTransaction" ref="atomikosUserTransaction" />
</bean>

<!-- enable transaction annotations, and use the correct transaction manager! -->
<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="sequenceDAO" class="com.findonnet.persistence.MessageSequenceDAO">
    <property name="dataSource" ref="dataSource" />
</bean>



<!-- ========================================= -->
<!-- ==== JMS CONFIG FOR SPRING=============== -->
<!-- ========================================= -->


<jms:annotation-driven container-factory="listenerContainer" />


<jms:listener-container connection-factory="atomikosConnectionFactoryBean"
    transaction-manager="transactionManager" concurrency="1"
    factory-id="listenerContainer" />


</beans>

我的 MessageHandlerImpl.handleOrder() 方法上有 @Transactional 和 @JmsListener(destination = "test.q1") 注释。

我不知道我做错了什么。

【问题讨论】:

    标签: spring jms activemq atomikos


    【解决方案1】:

    结果一切正常,消息最终进入死信队列。我现在觉得自己很傻。

    【讨论】:

      猜你喜欢
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      相关资源
      最近更新 更多