1、ActiveMQ的本地事务

在一个JMS客户端,可以使用本地事务来组合消息的发送和接收。JMS Session接口提供了commit和rollback方法。事务提交意味着生产的所有消息被发送,消费的所有消息被确认;事务回滚意味着生产的所有消息被销毁,消费的所有消息被恢复并重新提交,除非它们已经过期。 事务性的会话总是牵涉到事务处理中,commit或rollback方法一旦被调用,一个事务就结束了,而另一个事务被开始。关闭事务性会话将回滚其中的事务。 需要注意的是,如果使用请求/回复机制,即发送一个消息,同时希望在同一个事务中等待接收该消息的回复,那么程序将被挂起,因为直到事务提交,发送操作才会真正执行。 需要注意的还有一个,消息的生产和消费不能包含在同一个事务中。

在事务状态下进行发送操作,消息并未真正投递到中间件,而只有进行session.commit操作之后,消息才会发送到中间件,再转发到适当的消费者进行处理。如果是调用rollback操作,则表明,当前事务期间内所发送的消息都取消掉。

2、关于ActiveMQ本地事务的用法

public class Sender {  public static void main(String[] args) throws Exception {  // 1、建立ConnectionFactory工厂对象,需要填入用户名,密码,以及连接的地址  // 仅使用默认。端口号为"tcp://localhost:61616"  ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(  "zhangsan",// ActiveMQConnectionFactory.DEFAULT_USER,  "123",// ActiveMQConnectionFactory.DEFAULT_PASSWORD,  "tcp://localhost:61616");  // 2、通过ConnectionFactory工厂对象创建一个Connection连接  // 并且调用Connection的start方法开启连接,Connection默认是不开启的  Connection connection = connectionFactory.createConnection();  connection.start();  // 3、通过Connection对象创建Session会话(上下文环境对象),  // 参数一,表示是否开启事务  // 参数二,表示的是签收模式,一般使用的有自动签收和客户端自己确认签收  // 第一个参数设置为true,表示开启事务  // 开启事务后,记得要手动提交事务  Session session = connection.createSession(Boolean.TRUE,  Session.AUTO_ACKNOWLEDGE);  // 4、通过Session创建Destination对象,指的是一个客户端用来指定生产消息目标和消费消息来源的对象。  // 在PTP模式中,Destination指的是Queue  // 在发布订阅模式中,Destination指的是Topic  Destination destination = session.createQueue("queue1");  // 5、使用Session来创建消息对象的生产者或者消费者  MessageProducer messageProducer = session.createProducer(destination);  // 6、如果是,生产者,使用MessageProducer的setDeliverMode方法设置,消息的持久化和非持久化  messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);  // 7、最后使用JMS规范的TextMessage形式创建数据(通过Session对象)  // 并利用MessageProducer的send方法发送数据  for (int i = 0; i < 5; i++) {  TextMessage textMessage = session.createTextMessage();  textMessage.setText("我是消息" + i);  messageProducer.send(textMessage);  }  // 手动提交开启的事务  session.commit();  // 释放连接  if (connection != null) {  connection.close();  }  }
}  

2.1   开启事务

// 3、通过Connection对象创建Session会话(上下文环境对象),  // 参数一,表示是否开启事务  // 参数二,表示的是签收模式,一般使用的有自动签收和客户端自己确认签收  // 第一个参数设置为true,表示开启事务  // 开启事务后,记得要手动提交事务  Session session = connection.createSession(Boolean.TRUE,  Session.AUTO_ACKNOWLEDGE);  

2.2    提交事务

// 7、最后使用JMS规范的TextMessage形式创建数据(通过Session对象)  // 并利用MessageProducer的send方法发送数据  for (int i = 0; i < 5; i++) {  TextMessage textMessage = session.createTextMessage();  textMessage.setText("我是消息" + i);  messageProducer.send(textMessage);  }  // 手动提交开启的事务  session.commit();  

JMS学习五(ActiveMQ的本地事务)相关推荐

  1. JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系...

    一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent deliver ...

  2. JMS学习十 ActiveMQ支持的传输协议

    JMS学习(ActiveMQ支持的传输协议) ActiveMQ提供了一种连接机制,这种连接机制使用传输连接器(TransportConnector)实现客户端与代理(client - to - bro ...

  3. JMS学习(2):ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...

  4. JMS学习九 ActiveMQ的消息持久化到Mysql数据库

    1.将连接Mysql数据库驱动包,放到ActiveMQ的lib目录下 2,修改ActiveMQ的conf目录下的active.xml文件,修改数据持久化的方式 2.1  修改原来的kshadb的持久化 ...

  5. JMS学习(3):--ActiveMQ简单的HelloWorld实例

    第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...

  6. JMS学习十一 ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer)

    一.简介 Queue中的消息是按照顺序被分发到consumers的.然而,当你有多个consumers同时从相同的queue中提取消息时, 你将失去这个保证.因为这些消息是被多个线程并发的处理.有的时 ...

  7. JMS学习三(ActiveMQ消息的可靠性)

    下面我们来学习一下消息接受确认和发送持久化消息.消息的过期.消息的选择器和消息的优先级. 一.消息接收确认 1.jms消息只有在被确认之后才认为成功消费了这条消息.消息的成功消费通常包括三个步骤:(1 ...

  8. JMS学习八(ActiveMQ消息持久化)

    JMS学习八(ActiveMQ消息持久化) ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,还有一种内存存储的方式,由于内存不属于持久化范畴,而且如果使用内存队列,可 ...

  9. JMS学习六(ActiveMQ消息传送模型)

    JMS学习六(ActiveMQ消息传送模型) ActiveMQ 支持两种截然不同的消息传送模型:PTP(即点对点模型)和Pub/Sub(即发布 /订阅模型),分别称作:PTP Domain 和Pub/ ...

最新文章

  1. python os 检查同名_2020Python 爬虫面试题,高薪就业Python面试必看
  2. 【体验】说好的千元开发板,实用党体验单板机先驱者——Leez P710
  3. DL之GD:利用LogisticGD算法(梯度下降)依次基于一次函数和二次函数分布的数据集实现二分类预测(超平面可视化)
  4. 关于本地mysql客户端如何连接阿里云服务器上的MySQL数据库
  5. 在oracle中如何复制用户的权限不够,linux 普通用户下 移动或复制一个zip文件权限不够怎么办...
  6. Mysql多表查询笔记
  7. 计算机网络重点知识总结 谢希仁版,计算机网络谢希仁版网络层知识点总结
  8. 推荐一个可以减少开发量50%的插件!
  9. html5如何添加图片菜鸟教程,菜鸟入门教程 HTML5的常见用法
  10. python教你如何把自己的微信变成机器人
  11. shning friends---歌词
  12. BLM(业务领导模型)
  13. 计算机专业海报排版设计,我研究了2000张大神海报,终于总结出这个排版技巧...
  14. 通讯录管理系统C语言课程设计
  15. 人力资源数据分析师前景_偏人力的数据分析师怎么样?
  16. pwm频率输出不对解决思路
  17. android 优秀网站
  18. Java中List和数组Array和String之间的相互转换
  19. `英语` 2022/8/26
  20. java获取IP地址和MAC地址方式

热门文章

  1. python基础(11)之函数
  2. 计算机设计大赛国奖作品_2. 报名材料
  3. Python小白的数学建模课-03.线性规划
  4. python中strip是什么意思啊_python中的strip是什么意思
  5. 同步数据流语言代码生成工具的研究进展
  6. backward理解
  7. 条件编译 #ifndef _HEAD_H...中下划线的理解
  8. Django的简单介绍及虚拟环境的搭建、创建项目,数据库(Windows版超级详细)--Python web应用程序开发(Python实战)
  9. python学习-10 运算符1
  10. /etc/fstab 文件配置项简单介绍