JMS学习五(ActiveMQ的本地事务)
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的本地事务)相关推荐
- JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系...
一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent deliver ...
- JMS学习十 ActiveMQ支持的传输协议
JMS学习(ActiveMQ支持的传输协议) ActiveMQ提供了一种连接机制,这种连接机制使用传输连接器(TransportConnector)实现客户端与代理(client - to - bro ...
- JMS学习(2):ActiveMQ简单介绍以及安装
现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...
- JMS学习九 ActiveMQ的消息持久化到Mysql数据库
1.将连接Mysql数据库驱动包,放到ActiveMQ的lib目录下 2,修改ActiveMQ的conf目录下的active.xml文件,修改数据持久化的方式 2.1 修改原来的kshadb的持久化 ...
- JMS学习(3):--ActiveMQ简单的HelloWorld实例
第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...
- JMS学习十一 ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer)
一.简介 Queue中的消息是按照顺序被分发到consumers的.然而,当你有多个consumers同时从相同的queue中提取消息时, 你将失去这个保证.因为这些消息是被多个线程并发的处理.有的时 ...
- JMS学习三(ActiveMQ消息的可靠性)
下面我们来学习一下消息接受确认和发送持久化消息.消息的过期.消息的选择器和消息的优先级. 一.消息接收确认 1.jms消息只有在被确认之后才认为成功消费了这条消息.消息的成功消费通常包括三个步骤:(1 ...
- JMS学习八(ActiveMQ消息持久化)
JMS学习八(ActiveMQ消息持久化) ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,还有一种内存存储的方式,由于内存不属于持久化范畴,而且如果使用内存队列,可 ...
- JMS学习六(ActiveMQ消息传送模型)
JMS学习六(ActiveMQ消息传送模型) ActiveMQ 支持两种截然不同的消息传送模型:PTP(即点对点模型)和Pub/Sub(即发布 /订阅模型),分别称作:PTP Domain 和Pub/ ...
最新文章
- python os 检查同名_2020Python 爬虫面试题,高薪就业Python面试必看
- 【体验】说好的千元开发板,实用党体验单板机先驱者——Leez P710
- DL之GD:利用LogisticGD算法(梯度下降)依次基于一次函数和二次函数分布的数据集实现二分类预测(超平面可视化)
- 关于本地mysql客户端如何连接阿里云服务器上的MySQL数据库
- 在oracle中如何复制用户的权限不够,linux 普通用户下 移动或复制一个zip文件权限不够怎么办...
- Mysql多表查询笔记
- 计算机网络重点知识总结 谢希仁版,计算机网络谢希仁版网络层知识点总结
- 推荐一个可以减少开发量50%的插件!
- html5如何添加图片菜鸟教程,菜鸟入门教程 HTML5的常见用法
- python教你如何把自己的微信变成机器人
- shning friends---歌词
- BLM(业务领导模型)
- 计算机专业海报排版设计,我研究了2000张大神海报,终于总结出这个排版技巧...
- 通讯录管理系统C语言课程设计
- 人力资源数据分析师前景_偏人力的数据分析师怎么样?
- pwm频率输出不对解决思路
- android 优秀网站
- Java中List和数组Array和String之间的相互转换
- `英语` 2022/8/26
- java获取IP地址和MAC地址方式
热门文章
- python基础(11)之函数
- 计算机设计大赛国奖作品_2. 报名材料
- Python小白的数学建模课-03.线性规划
- python中strip是什么意思啊_python中的strip是什么意思
- 同步数据流语言代码生成工具的研究进展
- backward理解
- 条件编译 #ifndef _HEAD_H...中下划线的理解
- Django的简单介绍及虚拟环境的搭建、创建项目,数据库(Windows版超级详细)--Python web应用程序开发(Python实战)
- python学习-10 运算符1
- /etc/fstab 文件配置项简单介绍