ActiveMQ的学习(三)(ActiveMQ的消息事务和消息的确认机制)

ActiveMQ的消息事务

消息事务,是保证消息传递原子性的一个重要特性,和JDBC的事务特征类似。

一个事务性发送,其中一组消息要么能够全部保证到达服务器,要么都不到达服务器。生产者,消费者与消息服务器都支持事务性。ActiveMQ得事务主要偏向在生产者得应用。

ActiveMQ消息事务流程图:

原生jms事务发送(生产者的事务发送)

不加事务得情况:(程序没有错误,10条消息会到达mq中)

不加事务得情况:(程序有错误,结果是发送成功3条,其余不成功---因为没有加事务)

加事务得情况:(程序无错误)

 1 @Autowired
 2 private JmsMessagingTemplate jmsMessagingTemplate;
 3 @Autowired
 4 private JmsTemplate jmsTemplate;
 5 @Value("${activemq.name}")
 6 private String name;
 7
 8 public void sendMessageTx(){
 9     //获取连接工厂
10     ConnectionFactory connectionFactory = jmsMessagingTemplate.getConnectionFactory();
11     Session session = null;
12     try{
13         //创建连接
14         Connection connection = connectionFactory.createConnection();
15         //参数一:是否开启消息事务
16         session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
17         //创建生产者
18         MessageProducer producer = session.createProducer(session.createQueue(name));
19
20         for(int i=1;i<=10;i++){
21             TextMessage textMessage = session.createTextMessage("消息--"+i);
22             producer.send(textMessage);
23         }
24
25         //注意:一旦开启事务发送,那么就必须使用commit方法进行事务提交,否则消息无法到达MQ服务器
26         session.commit();
27     }catch(JMSException e){
28         e.printStackTrace();
29         //消息事务回滚
30         try{
31             session.rollback();
32         }catch(JMSException e1){
33             e1.printStackTrace();
34         }
35
36     }
37 }

加事务得情况:(程序有错误 结果一条都没有成功发送,原因就是开启了事务,事务的原子性导致的)

 1 @Autowired
 2 private JmsMessagingTemplate jmsMessagingTemplate;
 3 @Autowired
 4 private JmsTemplate jmsTemplate;
 5 @Value("${activemq.name}")
 6 private String name;
 7
 8 public void sendMessageTx(){
 9     //获取连接工厂
10     ConnectionFactory connectionFactory = jmsMessagingTemplate.getConnectionFactory();
11     Session session = null;
12     try{
13         //创建连接
14         Connection connection = connectionFactory.createConnection();
15         //参数一:是否开启消息事务
16         session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
17         //创建生产者
18         MessageProducer producer = session.createProducer(session.createQueue(name));
19
20         for(int i=1;i<=10;i++){
21
22             //模拟异常
23             if(i==4){
24                 int a = 10/0;
25             }
26
27             TextMessage textMessage = session.createTextMessage("消息--"+i);
28             producer.send(textMessage);
29         }
30
31         //注意:一旦开启事务发送,那么就必须使用commit方法进行事务提交,否则消息无法到达MQ服务器
32         session.commit();
33     }catch(JMSException e){
34         e.printStackTrace();
35         //消息事务回滚
36         try{
37             session.rollback();
38         }catch(JMSException e1){
39             e1.printStackTrace();
40         }
41
42     }
43 }

JMSTransactionManager(生产者的事务发送)

spring的JmsTransactionManager功能(这里不详细介绍了)

消费者的事务接收

这里要注意:如果重发了6次之后,还没有成功,那么会把该消息发送到一个死信队列中(至于什么叫死信队列在后面会提到)

 ActiveMQ的消息确认机制

JMS消息只有在被确认之后,才认为已经被成功的消费了。消息的成功消费通常包含三个阶段:客户接收消息,客户处理消息和消息被确认。在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。该参数有三个可选值:

注意:消息确认机制与事务机制是冲突的,只能选其中一种,所以演示消息确认前,先关闭事务。

参考:

黑马程序员视频:ActiveMQ部分的内容,若有侵权,请联系我,立即删除。

持续更新!!!

原文地址:https://www.cnblogs.com/flyinghome/p/12311964.html

时间: 2024-09-30 19:45:43

ActiveMQ的学习(三)(ActiveMQ的消息事务和消息的确认机制)的相关文章

RabbitMQ消息发布和消费的确认机制

前言 新公司项目使用的消息队列是RabbitMQ,之前其实没有在实际项目上用过RabbitMQ,所以对它的了解都谈不上入门.趁着周末休息的时间也猛补习了一波,写了两个窗体应用,一个消息发布端和消息消费端.园子里解释RabbitMQ基础的很多了,这里就不对RabbitMQ的基础再做叙述了,来点实际工作中一定会碰到的问题和解决的方案. RabbitMQ 消息发布确认机制 默认情况下消息发布端执行BasicPublish方法后,消息是否到达指定的队列的结果发布端是未知的.BasicPublish方法的

springboot项目整合rabbitMq涉及消息的发送确认,消息的消费确认机制

1.引入maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>2.在application.yml的配置: spring: rabbitmq: host: 106.52.82.241 port: 5672 username: yang

ActiveMQ源码解析(四):聊聊消息的可靠传输机制和事务控制

在消息传递的过程中,某些情况下比如网络闪断.丢包等会导致消息永久性丢失,这时消费者是接收不到消息的,这样就会造成数据不一致的问题.那么我们怎么才能保证消息一定能发送给消费者呢?怎么才能避免数据不一致呢?又比如我们发送多条消息,有时候我们期望都发送成功但实际上其中一部分发送成功,另一部分发送失败了,没达到我们的预期效果,那么我们怎么解决这个问题呢? 前一种问题我们通过消息确认机制来解决,它分为几种模式,需要在创建session时指定是否开启事务和确认模式,像下面这样: <span style=&quo

ActiveMQ学习笔记(五)——使用Spring JMS收发消息

ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次收发消息都要写许多重复的代码,Spring 为我们提供了更为方便的方式,这就是Spring JMS.我们通过一个例子展开讲述.包括队列.主题消息的收发相关的Spring配置.代码.测试. 本例中,消息的收发都写在了一个工程里. 1.使用maven管理依赖包 <dependencies> <depend

JMS学习(八)-ActiveMQ Consumer 使用 push 还是 pull 获取消息

ActiveMQ是一个消息中间件,对于消费者而言有两种方式从消息中间件获取消息: ①Push方式:由消息中间件主动地将消息推送给消费者:②Pull方式:由消费者主动向消息中间件拉取消息.看一段官网对Push方式的解释: To be able to achieve high performance it is important to stream messages to consumers as fast as possible so that the consumer always has a

ActiveMQ发消息和收消息

来自:http://blog.163.com/chengwei_1104/blog/static/53645274201382315625329/ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位. 下面详细的解释常用类的作用 ConnectionFactory 接口(连接工厂) 用

activemq的消息确认机制ACK

一.简介 消息消费者有没有接收到消息,需要有一种机制让消息提供者知道,这个机制就是消息确认机制. ACK(Acknowledgement)即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符.表示发来的数据已确认接收无误. 二.ACK_MODE有几类 我们在开发JMS应用程序的时候,会经常使用到上述ACK_MODE,其中"INDIVIDUAL_ACKNOWLEDGE "只有ActiveMQ支持,当然开发者也可以使用它. ACK_MODE描述了Consumer与broker确认

ActiveMQ进阶学习

本文主要讲述ActiveMQ与spring整合的方案.介绍知识点包括spring,jms,activemq基于配置文件模式管理消息,消息监听器类型,消息转换类介绍,spring对JMS事物管理. 1.spring整合activemq配置文件说明 1.1配置ConnectionFactory ConnectionFactory是用于产生到JMS服务器的链接的,Spring提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectio

ActiveMQ入门系列三:发布/订阅模式

在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点模式并用代码实例进行说明,今天就介绍下发布/订阅模式. 一.理论基础 发布/订阅模式的工作示意图: 消息生产者将消息(发布)到topic中,可以同时有多个消息消费者(订阅)消费该消息. 和点对点方式不同,发布到topic的消息会被所有订阅者消费. 当生产者发布消息,不管是否有消费者,都不会保存消息. 一定要先