2015-08-24 7 views
0

У меня есть простая тестовая установка XA с использованием JMS и JDBC. Я использую Atomikos 3.9.3, ActiveMQ 5.10.1 и DB2 с их соответствующими драйверами XA.JMS Сообщение потребляется, несмотря на откат транзакции

Отправка сообщений в порядке, транзакция. Но в случае с потреблением нет - несмотря на то, что выбрасывается исключение, сообщение JMS потребляется.

Странно, что, похоже, это связано с синхронизацией - обычно при первом откате транзакции, а сообщение все еще существует, но одна из последующих попыток потребления сообщения из очереди прошла успешно.

Это моя конфигурация пружины для потребления сообщений:

<?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> 

У меня есть @Transactional и @JmsListener (пункт назначения = "test.q1") аннотации на мой MessageHandlerImpl.handleOrder() метод.

Я понятия не имею, что я делаю неправильно.

ответ

0

Оказывается, все работает нормально, сообщения попадали в очередь мертвых букв. Теперь я чувствую себя глупо.