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 ...
- spring深入学习(五)-----spring dao、事务管理
访问数据库基本是所有java web项目必备的,不论是oracle.mysql,或者是nosql,肯定需要和数据库打交道.一开始学java的时候,肯定是以jdbc为基础,如下: private sta ...
- JMS学习(八)-ActiveMQ Consumer 使用 push 还是 pull 获取消息
ActiveMQ是一个消息中间件,对于消费者而言有两种方式从消息中间件获取消息: ①Push方式:由消息中间件主动地将消息推送给消费者:②Pull方式:由消费者主动向消息中间件拉取消息.看一段官网对P ...
- JMS学习(七)-ActiveMQ消息的持久存储方式之KahaDB存储
一,介绍 自ActiveMQ5.4以来,KahaDB成为了ActiveMQ默认的持久化存储方式.相比于原来的AMQ存储方式,官方宣称KahaDB使用了更少的文件描述符,并且提供了更快的存储恢复机制. ...
- JMS学习(六)-ActiveMQ的高可用性实现
原文地址:http://www.cnblogs.com/hapjin/p/5663024.html 一,ActiveMQ高可用性的架构 ActiveMQ的高可用性架构是基于Master/Slave 模 ...
- springboot深入学习(五)-----spring data、事务
spring data项目是spring解决数据访问问题的一系列解决方案,包含了大量关系型数据库以及非关系型数据库的访问解决方案. 一.spring data jpa 1.简介 jpa是一套规范,不提 ...
- JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))
一.简介 Queue中的消息是按照顺序被分发到consumers的.然而,当你有多个consumers同时从相同的queue中提取消息时, 你将失去这个保证.因为这些消息是被多个线程并发的处理.有的时 ...
- JMS学习三(ActiveMQ消息的可靠性)
下面我们来学习一下消息接受确认和发送持久化消息.消息的过期.消息的选择器和消息的优先级. 一.消息接收确认 1.jms消息只有在被确认之后才认为成功消费了这条消息.消息的成功消费通常包括三个步骤:(1 ...
- ActiveMQ基本详解与总结& 消息队列-推/拉模式学习 & ActiveMQ及JMS学习
转自:https://www.cnblogs.com/Survivalist/p/8094069.html ActiveMQ基本详解与总结 基本使用可以参考https://www.cnblogs.co ...
随机推荐
- Maven - Maven3实战学习笔记(1)Maven使用入门
1.maven安装 1>http://maven.apache.org/download.cgi下载apache-maven-3.6.1 2>解压缩安装包到指定的文件夹,如C:\fyliu ...
- 小记-----如何把本地jar包加载到maven库中
1.从maven中央库下载下jar包
- 洛谷 P5043 树的同构 题解
题面 本题的难度其实不及紫题的难度.主要是在hash时的处理细节比较繁琐: 首先是树hash的模板: long long treehash(int u,int fa) { ]; ; ; for(int ...
- python-day17(正式学习)
目录 包 一.什么是包? 二.为什么要有包? 三.如何用包? 3.1 模块和包 3.2 扩展模块功能 3.3 修改__init__.py文件 绝对导入和相对导入 注意事项 模块不来总结了,直接去htt ...
- 求x到y的最少计算次数 (BFS)
时间限制:1秒 空间限制:262144K 给定两个-100到100的整数x和y,对x只能进行加1,减1,乘2操作,问最少对x进行几次操作能得到y? 例如:a=3,b=11: 可以通过3*2*2-1,3 ...
- crm客户资源显示控制
为便于员工之间的良性竞争,避免恶意挖客户,对于不同的登录用户,在客户列表中只显示当用用户自己所拥有的客户列表. ---具体的,通过在列表显示界面的列表查询语句中增加根据用户id查询其对应的客户资源的条 ...
- 从零开始学MySQL(三)
经过上两节的洗礼,我们能够连接上服务器,并成功地进入与mysql交互的会话中了.那么现在就可以发起SQL语句,让服务器来执行它了!这听起来很酷吧?接下来,我们开始学习MySQL的相关知识. 本文概览: ...
- 四、Vue CLI-异步请求(axios)
一.模块的安装 npm install axios --save #--save可以不用写 如图: 二.配置main.js import axios from 'axios' Vue.prototyp ...
- oracle 如何解锁表
--查询被锁的表 select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects ...
- Linux sed神器
sed -i -c -e '/^#/d'去掉注释行 sed -i -c -e '/^$/d'去掉空行 sed -i -c -e '/^$/d;/^#/'同时去掉空行和注释行 sed -i 's/^/H ...