欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JTA分布式事务之JMS篇

程序员文章站 2022-07-13 16:52:57
...

 前言

我在上篇文章《【消息队列】ActiveMQSpring集成》讲解如何用spring编写一个简单的发送消息然后接收的JMS应用,不过例子中为了简单并没有使用事务,本文主要讲下如何增加事务的控制。在JMS中有两种事务控制方式:本地事务和JTA事务。由于实际的业务很少完全脱离数据库的使用,经常需要在一个事务中同时操作数据库和JMS,所以一般会使用JTA事务控制(分布式事务),本文就只讲JTA的事务配置。

关于JTA事务如何配置我在文章《JTA分布式事务实践》已经有了较详细的讲解,但是文章只使用了数据库,本文将在此基础上增加JMS的配置部分。

本文的讲解使用的是第三方独立JTA组件atomikos。如果是使用容器提供的JTA,那么配置其实更简单,通常这种J2EE服务器会同时提供JMSJTA支持(例如jbosswebsphere),项目中只需通过JNDI获取就行,不过这种情况项目与应用服务器的绑定在一起了,我更喜欢用轻量化的设计,所以JMSJTA都使用第三方独立组件。

 

开始

更改为XAConnectionFactory

JTA事务需要使用XA协议,所以改用XAConnectionFactory,如下

 

<!—ActiveMQ提供了一个XAConnectionFactory来支持JTA事务--> 

<bean id="amqXaConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">

        <property name="brokerURL" value="tcp://localhost:61616" />

</bean>

 

使用atomikosConnectionFactory实现JTA事务

由于使用的是第三方独立JTA组件,这儿配置一个atomikosconnectionFactory来使activemqconnectionFactory实现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支持事务

设置sessionTransactedtrue使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分布式事务之JMS篇
            
    
    博客分类: 分布式 JTAJMS消息队列分布式 

接收事务

在上文介绍的监听容器中引入JTA事务管理器,这样接收的消息也被控制在事务中了

 

 JTA分布式事务之JMS篇
            
    
    博客分类: 分布式 JTAJMS消息队列分布式 

 

 

 

  • JTA分布式事务之JMS篇
            
    
    博客分类: 分布式 JTAJMS消息队列分布式 
  • 大小: 10.3 KB
  • JTA分布式事务之JMS篇
            
    
    博客分类: 分布式 JTAJMS消息队列分布式 
  • 大小: 9.9 KB