JTA分布式事务之JMS篇
前言
我在上篇文章《【消息队列】ActiveMQ与Spring集成》讲解如何用spring编写一个简单的发送消息然后接收的JMS应用,不过例子中为了简单并没有使用事务,本文主要讲下如何增加事务的控制。在JMS中有两种事务控制方式:本地事务和JTA事务。由于实际的业务很少完全脱离数据库的使用,经常需要在一个事务中同时操作数据库和JMS,所以一般会使用JTA事务控制(分布式事务),本文就只讲JTA的事务配置。
关于JTA事务如何配置我在文章《JTA分布式事务实践》已经有了较详细的讲解,但是文章只使用了数据库,本文将在此基础上增加JMS的配置部分。
本文的讲解使用的是第三方独立JTA组件atomikos。如果是使用容器提供的JTA,那么配置其实更简单,通常这种J2EE服务器会同时提供JMS和JTA支持(例如jboss、websphere),项目中只需通过JNDI获取就行,不过这种情况项目与应用服务器的绑定在一起了,我更喜欢用轻量化的设计,所以JMS和JTA都使用第三方独立组件。
开始
更改为XAConnectionFactory
JTA事务需要使用XA协议,所以改用XAConnectionFactory,如下
<!—ActiveMQ提供了一个XAConnectionFactory来支持JTA事务--> <bean id="amqXaConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616" /> </bean> |
使用atomikos的ConnectionFactory实现JTA事务
由于使用的是第三方独立JTA组件,这儿配置一个atomikos的connectionFactory来使activemq的connectionFactory实现JTA事务支持。
<!-- 使用atomikos支持jta,同时支持connect缓存功能 --> <bean id="connectionFactory" class="com.atomikos.jms.AtomikosConnectionFactoryBean" init-method="init"> <property name="uniqueResourceName" value="XAactiveMQ" /> <property name="xaConnectionFactory" ref="amqXaConnectionFactory"/> <property name="poolSize" value="5"/> </bean> |
发送事务
配置JmsTemplate支持事务
设置sessionTransacted为true使JmsTemplate支持发送事务
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <property name="sessionTransacted" value="true"/> </bean> |
发送事务封装
只需在上回的生产者中加上@Transactional来增加JTA的事务封装就行如下图(关于JTA的事务配置参考之前我发的JTA分布式事务文章)
接收事务
在上文介绍的监听容器中引入JTA事务管理器,这样接收的消息也被控制在事务中了
上一篇: 【Java NIO 简例】Channel