atomikos activemq

分布式事务相信大家都用过,一般来说分布式事务主要用在数据库上。但是项目中用到了消息队列,猜想atomikos事务是否支持消息队列?虽然现在项目中还没有碰到消息队列与数据库绑定在一个事务中,但是打算自己提前搭建与测试一下,免得后面用到。在网上搜了一下,主要就是配置的问题,中间也走了不少弯路,现在列出来,供大家参考。

  • 修改pom.xml

注意的atomikos版本,因为之前用的是3.7.0,所以transactions-jms的也是用3.7.0,不然启动抛异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


<>
<groupId>com.atomikos</groupId>
<artifactId>transactions-jdbc</artifactId>
<version>3.7.0</version>
</>

<>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</>

<!-- 支持jms的分布式事务 ,版本使用3.7.0,使用高版本可能出现Caused by: java.lang.NoClassDefFoundError: com/atomikos/logging/LoggerFactory错误 -->
<>
<groupId>com.atomikos</groupId>
<artifactId>transactions-jms</artifactId>
<version>3.7.0</version>
</dependency>
  • 修改activemq的xml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

<!-- MQ factory -->
<bean id="xaMbaActivemqFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
<property name="brokerURL" value="${active.mq.broker}" />
<property name="redeliveryPolicy" ref="mbaRedeliveryPolicy" />
</bean>

<bean id="atomikosConnectionFactory" class="com.atomikos.jms.AtomikosConnectionFactoryBean"
init-method="init" destroy-method="close">

<property name="uniqueResourceName" value="axActiveMQ" />
<property name="xaConnectionFactory">
<ref bean="xaMbaActivemqFactory" />
</property>

<!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="atomikosConnectionFactory" />
<property name="receiveTimeout" value="10000" />
<!-- 必须要加上这个才有效 -->
<property name="sessionTransacted" value="true" />
</bean>
  • 具体的事务管理器和之前的jdbc的事务管理器一样,

可以通过aspectj配置,也可要通过注解配置,这里为了简单,使用注解配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!--别忘记了-->
<tx:annotation-driven />

<!-- 事务这块用spring管理atomikos -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">

<property name="forceShutdown">
<value>true</value>
</property>
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>

<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">

<property name="transactionManager">
<ref bean="atomikosTransactionManager" />
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction" />
</property>
<!-- 必须设置,否则程序出现异常 JtaTransactionManager does not support custom isolation
levels by default -->

<property name="allowCustomIsolationLevels" value="true" />
</bean>