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 ... 
随机推荐
- 【转帖】国产x86处理器KX-6000发布
			国产最先进x86处理器KX-6000发布:8核3.0GHz 力压酷睿i5处理器 https://www.cnbeta.com/articles/tech/858981.htm 全网所有的网页都写错了 ... 
- pythonWeb框架创建app模块以及虚拟环境管理工具
			在进行项目搭建的时候,如果有多个功能模块,以及多个网页地址时,为了系统的可维护性,以及易读性,我们大多数情况下选择模块化开发 所以我们就要使用app指令来创建不同的功能模块 首先项目框架如下: 接下来 ... 
- 09、RNA降解图的计算过程
			RNA降解是影响芯片质量的一个很重要的因素,因为RNA是从5’开始降解的,所以理论5’的荧光强度要低于3’.RNA降解曲线可以表现这种趋势. 以样品GSM286756.CEL和GSM286757.CE ... 
- filebeat收集日志传输到Redis集群,logstash从Redis集群中拉取数据
			前提:已配置好Redis集群,并设置的有统一的访问密码 架构是filebeat-->redis集群-->logstash->elasticsearch,需要修改filebeat的输出 ... 
- 【转载】jquery版的网页倒计时效果
			<!doctype html> <html> <head> <meta charset="utf-8"> <title> ... 
- Ubuntu换阿里云源
			sudo -s cd /etc/apt gedit source.list deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted u ... 
- 安装wordpress的过程
			1 首先安装lamp.在安装php时,由于ubuntu16.04源中自带的是php7,所以需要直接安装 apt-get install phpapt-get install libapache2-mo ... 
- centos在无外网情况下,进行yum挂载
- Linux日常之数据重定向
			Linux在启动后,会默认打开3个文件操作符,分别是 (1)标准输入0,standard input (2)正确输出1,standard output (3)错误输出2,standard error ... 
- java高并发核心要点|系列2|锁的底层实现原理
			上篇文章,我们主要讲了解决多线程之间共享数据的核心问题和解决方案,也讲了锁的简单分类. 那么,这把锁,我们应该怎么去实现呢?如果你是java语言设计者,你又会怎么去设计这个线程锁呢? 直觉告诉我们,我 ... 
