JMS 基本可靠性机制 和 事务机制
4.3.1 基本可靠性机制
4.3.1.1 控制消息的签收(Acknowledgment)
客户端成功接收一条消息的标志是这条消息被签收。成功接收一条消息一般包括如
下三个阶段:
1.客户端接收消息;
2.客户端处理消息;
3.消息被签收。签收可以由ActiveMQ 发起,也可以由客户端发起,取决于Sessi
on 签收模式的设置。
在带事务的 Session 中,签收自动发生在事务提交时。如果事务回滚,所有已经接
收的消息将会被再次传送。
在不带事务的Session 中,一条消息何时和如何被签收取决于Session 的设置。
1.Session.AUTO_ACKNOWLEDGE
当客户端从 receive 或onMessage 成功返回时,Session 自动签收客户端的这
条消息的收条。在AUTO_ACKNOWLEDGE 的Session 中,同步接收receive 是上述三个阶
段的一个例外,在这种情况下,收条和签收紧随在处理消息之后发生。
2.Session.CLIENT_ACKNOWLEDGE
客户端通过调用消息的 acknowledge 方法签收消息。在这种情况下,签收发生。
在Session 层面:签收一个已消费的消息会自动地签收这个Session 所有已消费消息的
收条。
3.Session.DUPS_OK_ACKNOWLEDGE
此选项指示 Session 不必确保对传送消息的签收。它可能引起消息的重复,但
是降低了Session 的开销,所以只有客户端能容忍重复的消息,才可使用(如果Activ
eMQ 再次传送同一消息,那么消息头中的JMSRedelivered 将被设置为true)。
4.3.2.2 使用本地事务
在事务中生成或使用消息时,ActiveMQ 跟踪各个发送和接收过程,并在客户端发出
提交事务的调用时完成这些操作。如果事务中特定的发送或接收操作失败,则出现异常。
客户端代码通过忽略异常、重试操作或回滚整个事务来处理异常。在事务提交时,将完
成所有成功的操作。在事务进行回滚时,将取消所有成功的操作。
本地事务的范围始终为一个会话。也就是说,可以将单个会话的上下文中执行的一
个或多个生产者或消费者操作组成一个本地事务。
不但单个会话可以访问 Queue 或 Topic (任一类型的 Destination ),而且单
个会话实例可以用来操纵一个或多个队列以及一个或多个主题,一切都在单个事务中进
行。这意味着单个会话可以(例如)创建队列和主题中的生产者,然后使用单个事务来
同时发送队列和主题中的消息。因为单个事务跨越两个目标,所以,要么队列和主题的
消息都得到发送,要么都未得到发送。类似地,单个事务可以用来接收队列中的消息并
将消息发送到主题上,反过来也可以。
由于事务的范围只能为单个的会话,因此不存在既包括消息生成又包括消息使用的
端对端事务。(换句话说,至目标的消息传送和随后进行的至客户端的消息传送不能放
在同一个事务中。)
Java 客户端:
签收模式分别为:
1. Session.AUTO_ACKNOWLEDGE
2. Session.CLIENT_ACKNOWLEDGE
3. Session.DUPS_OK_ACKNOWLEDGE
ActiveMQConnection 方法:
Session createSession(boolean transacted, int acknowledgeMode);
例如:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
C++客户端:
签收模式分别为:
1. Session::AUTO_ACKNOWLEDGE
2. Session::CLIENT_ACKNOWLEDGE
3. Session:UPS_OK_ACKNOWLEDGE
4. Session::SESSION_TRANSACTED
函数原型:
cms::Session* ActiveMQConnection::createSession(
cms::Session::AcknowledgeMode ackMode )
throw ( cms::CMSException )
例如:
Session* session = connection->createSession( Session::AUTO_ACKNOWLEDGE );
对队列来说,如果当一个Session 终止时它接收了消息但是没有签收,那么Activ
eMQ 将保留这些消息并将再次传送给下一个进入队列的消费者。
对主题来说,如果持久订阅用户终止时,它已消费未签收的消息也将被保留,直到
再次传送给这个用户。对于非持久订阅,AtiveMQ 在用户Session 关闭时将删除这些消
息。
如果使用队列和持久订阅,并且Session 没有使用事务,那么可以使用Session 的
recover 方法停止Session,再次启动后将收到它第一条没有签收的消息,事实上,重
启后Session 一系列消息的传送都是以上一次最后一条已签收消息的下一条为起点。如
果这时有消息过期或者高优先级的消息到来,那么这时消息的传送将会和最初的有所不
同。对于非持久订阅用户,重启后,ActiveMQ 有可能删除所有没有签收的消息。
4.3.1.2 指定消息传送模式
ActiveMQ 支持两种消息传送模式:PERSISTENT 和NON_PERSISTENT 两种。
1.PERSISTENT(持久性消息)
这是 ActiveMQ 的默认传送模式,此模式保证这些消息只被传送一次和成
功使用一次。对于这些消息,可靠性是优先考虑的因素。可靠性的另一个重要方面是确
保持久性消息传送至目标后,消息服务在向消费者传送它们之前不会丢失这些消息。这
意味着在持久性消息传送至目标时,消息服务将其放入持久性数据存储。如果消息服务
由于某种原因导致失败,它可以恢复此消息并将此消息传送至相应的消费者。虽然这样
增加了消息传送的开销,但却增加了可靠性。
2.NON_PERSISTENT(非持久性消息)
保证这些消息最多被传送一次。对于这些消息,可靠性并非主要的考虑因素。
此模式并不要求持久性的数据存储,也不保证消息服务由于某种原因导致失败后消息不
会丢失。
JMS 基本可靠性机制 和 事务机制的更多相关文章
- MQ确认机制之事务机制------tx
一:介绍 1.介绍 在前面的说的模式中会出现一个问题. 就是生产者将消息发送出去到底有没有到达rabbitMq,默认情况下是不知道. 有两种解决方式. AMQP实现事务机制 Confirm机制. 这里 ...
- MQ确认机制之事务机制----confirm串行
一:介绍 1.说明原理 A:生产者将信道设置成confirm模式,一旦信道进到confirm模式,所有该信道上发布的消息都会被指派一个唯一的ID(从1开始). 一旦消息被投递到所有匹配的队列后,bro ...
- Kafka设计解析(八)- Exactly Once语义与事务机制原理
原创文章,首发自作者个人博客,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/transaction/ 写在前面的话 本 ...
- Kafka设计解析(八)Exactly Once语义与事务机制原理
转载自 技术世界,原文链接 Kafka设计解析(八)- Exactly Once语义与事务机制原理 本文介绍了Kafka实现事务性的几个阶段——正好一次语义与原子操作.之后详细分析了Kafka事务机制 ...
- ActiveMQ中JMS的可靠性机制
全文用到的生产者代码: package cn.qlq.activemq; import javax.jms.Connection; import javax.jms.ConnectionFactory ...
- ActiveMQ学习笔记(3)----JMS的可靠性机制
1. 消息接收确认 JMS消息只有在被确认之后,才认为已经被成功的消费了,消息成功消费通常包含三个阶段:客户接收消息,客户处理消息和消息被确认. 在事务性会话中,当一个事务被提交的时候,确认自动发生. ...
- NoSQL生态系统——事务机制,行锁,LSM,缓存多次写操作,RWN
13.2.4 事务机制 NoSQL系统通常注重性能和扩展性,而非事务机制. 传统的SQL数据库的事务通常都是支持ACID的强事务机制.要保证数据的一致性,通常多个事务是不可能交叉执行的,这样就导致了可 ...
- MySQL事务机制
事务机制的特性通常被概括为"ACID原则" A(Atomic) 原子性: 构成一个事务的所有语句应该是一个独立的逻辑单元,要么全部执行成功, 要么一个都不成功, 你不能只执行他们当 ...
- 学习ActiveMQ(六):JMS消息的确认与重发机制
当我们发送消息的时候,会出现发送失败的情况,此时我们需要用到activemq为我们提供了消息重发机制,进行消息的重新发送.那么我们怎么知道消息有没有发送失败呢?activemq还有消息确认机制,消费者 ...
随机推荐
- AutoESL与Xilinx那些人和事
大年三十,看到Xilinx收购AutoESL的新闻, 顿时觉得今年特别喜庆,于是,连春晚也懒得骂了. 本想立即写一篇博文八卦一番, 怎奈亲朋好友饭局不断,一直拖到今天才动笔. 与一年前Xilinx宣布 ...
- oozie与sqoop的简单案例
1:拷贝模板 2:拷贝hive用的jar包 方式一: 3:编辑job.properties # # Licensed to the Apache Software Foundation (ASF) u ...
- sg函数&&子状态的讨论
题目链接:https://cn.vjudge.net/contest/269933#problem/H 具体思路:首先,这是一个公平的比赛,并且是两个人参与,两个人都足够聪明,并且可以通过有限步结束比 ...
- [Leetcode] N-Queens 系列
N-Queens 系列题解 题目来源: N-Queens N-Queens II N-Queens The n-queens puzzle is the problem of placing n qu ...
- 【转载】selenium with PhantomJs wait till page fully loaded?
I use Selenium with Phantomjs, and want to get the page content after the page fully loaded. I tried ...
- 删除数组某一项,使用splice的坑
var arr=[1,2,3,4,5,6,7,8,9,10];//创建数组 var testArr=arr;//让testArr等于创建的数组 arr.splice(0,1);删除arr数组的第一项 ...
- ftp--vsftp\pureftpd
FTP是File Transfer Protocol(文件传输协议),用于Internet上的控制文件的双向传输. 现今常用在一个局域网内,如学校.公司等一个指定范围的区域.(因为太过于简单和不安全) ...
- Percona XtraDB Cluster(PXC) Mysql 集群
Percona XtraDB Cluster(PXC) ---原理介绍篇 目录 一.简介 1 二.优缺点 2 三.区别/局限性 3 四. PXC复制原理 4 五. 服务解释 5 ...
- Python+Selenium 自动化实现实例-获取测试对象的Css属性
#coding:utf-8 '''获取测试对象的css属性场景 当你的测试用例纠结细枝末节的时候,你就需要通过判断元素的css属性来验证你的操作是否达到了预期的效果.比如你可以通过判断页面上的标题字号 ...
- 如何才能通俗易懂地解释JS中的的"闭包"?
看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...