JMS - 消息确认
消息确认机制
消息确认协议是保证消息传送的关键所在,同时,支持确认也是 JMS API 语义的要求。以下将分别从消息生产者、消息服务器、消息消费者的角度,来考察消息确认机制。
从消息生产者的角度考察
在表象之下,TopicPublisher.publish() 或 QueueSender.send() 方法是同步的。这些方法负责发送消息,同时进行阻塞,直到从消息服务器接收到一个确认为止。一旦接收到一个确认,执行线程就会恢复并返回方法,并像正常情况那样继续处理。底层确认对客户端编程模型来说是不可见的。如果在这个操作期间发生了一个故障情况,就会抛出一个异常,同时认为该消息未被传送。
从消息服务器的角度考察
从消息服务器的发送到生产者,意味着服务器已经接收到该消息,并已经承担了传送它的责任。
在发布/订阅模型中,消息服务器向每个订阅者都传送了消息的一个副本。对于持久订阅者来说,一直到消息服务器接收到所有的消息预定接收者的确认时,消息服务器才会认为该消息已经完成传送。一旦消息服务器将消息传送给所有的已知订阅者,并已分别从这些订阅者那里接收到确认,就会将这些消息从持久存储器中删除。
如果订阅是持久的,而且订阅者当前并未连接,那么,消息服务器就会将该消息保存起来,直到该订阅者变为可用状态或消息到期为止。甚至对于非持久性消息来说,也是如此。如果一条非持久性消息原本打算供未连接的持久订阅者使用,消息服务器会将该消息保存到磁盘中,就好像它是一条持久性消息一样。这时,持久性和非持久性这两种消息的差异虽然很细微,但是非常重要。对于非持久性消息来说,在消息服务器已经向发送者确认消息之后和消息服务器有机会代表未连接的持久订阅者将消息写人磁盘之前,这二者之间可能会有一个时间窗。如果 JMS 提供者在这个时间窗内出现故障,该消息就可能会丢失。不过,JMS 规范虽然暗示了可能会出现这种故障情况。但实际上 JMS 提供者可能不会允许这种情况出现。在使用持久性消息时,一个提供者可能会出现故障,并且优雅地恢复正常。由于消息保存在持久存储器中,它们并没有丢失。在提供者再次启动时,它们又会传送给消费者。
从消息消费者的角度考察
从消费者的角度考虑,当每个消费者获得消息时,它需要向服务器发送确认信息。如果服务器没有收到这个确认信息,它就会认为该消息未被传送,并可能试图重新传送。
在将一条消息传送给非持久订阅的消费者时,如果提供者出现故障,这条消息就可能会丢失。如果一个持久订阅接收到一条消息,并在向提供者返回确认之前出现了故障,那么,JMS 提供者就会认为该消息未被传送,并试图对它进行重新传送。在这种情况下,“一次而且是仅仅一次”的要求就值得怀疑。消费者可能会再次接收到该消息,重新传送的消息会被设置 JMSRedelived 标记。为了预防消息重复,应用程序可以检查重新传送的消息是否已被处理。
消费者确认消息的方式
AUTO_ACKNOWLEDGE
当消费者获取消息时,JMS 提供者的客户端运行时环境必须自动向服务器发送确认信息。
DUPS_OK_ACKNOWLEDGE
AUTO_ACKNOWLEDGE 模式允许消费者在收到多个消息之后一次完成确认。
CLIENT_ACKNOWLEDGE
CLIENT_ACKNOWLEDGE 模式中,接收消息的客户端可以通过 javax.jms.Message.acknowledge() 方法控制何时发送确认。
public void onMessage(Message message) {
try {
// 获取消息来执行相关的业务逻辑
... message.acknowledge(); // 执行更多的 业务逻辑
...
} catch (Exception e) {
// 捕获抛出的异常,并取消局部处理结果
...
}
}
JMS - 消息确认的更多相关文章
- JMS开发(三):JMS消息的确认方式
这里单独列出来我也是觉得有点必要的,毕竟JMS总体知识点并不多,这点可能被很多人所忽视. 首选定义:消息的确认是指消息接受者接到消息,并做出了对应的处理之后,它将回送一个确认消息. 对于非事务性会话, ...
- 学习ActiveMQ(六):JMS消息的确认与重发机制
当我们发送消息的时候,会出现发送失败的情况,此时我们需要用到activemq为我们提供了消息重发机制,进行消息的重新发送.那么我们怎么知道消息有没有发送失败呢?activemq还有消息确认机制,消费者 ...
- ActiveMQ的消息确认问题
http://riddickbryant.iteye.com/blog/441890 [发送端] session = connection.createSession(Boolean.FALSE, ...
- JMS消息传输机制
JMS消息传送模型: 消息传送机制, 是基于拉取(pull)或者轮询(polling)的方式. JMS具备两种"消息传送模型": P2P和Pub/sub. (1) P2P:点对点 ...
- JavaEE(6) - JMS消息选择和查看
1. JMS消息的类型.消息头和消息属性 消息类型: StreamMessage MapMessage TextMessage ObjectMessage BytesMessage JMS消息中的消息 ...
- activemq的消息确认机制ACK
一.简介 消息消费者有没有接收到消息,需要有一种机制让消息提供者知道,这个机制就是消息确认机制. ACK(Acknowledgement)即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符 ...
- 学习ActiveMQ(七):JMS消息的事务管理
Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.JmsTransactio ...
- SpringBoot集成RabbitMQ消息队列搭建与ACK消息确认入门
1.RabbitMQ介绍 RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.Rabbi ...
- JAVA消息确认机制之ACK模式
JMS API中约定了Client端可以使用四种ACK模式,在javax.jms.Session接口中: AUTO_ACKNOWLEDGE = 1 自动确认 CLIENT_ACKNOWLEDGE ...
随机推荐
- ASP.NET项目中引用全局dll
在ASP.NET项目中,有些dll是全局dll,也就是说,没有放在单个项目的引用中.它们一般存放在如下目录C:\Windows\assembly中 这个时候,我们需要在单个项目中引用他们,应该如何做呢 ...
- 转载Agile Development 敏捷软件开发介绍
转载原地址: http://blog.csdn.net/wayne_ran/article/details/1601008 敏捷开发(agile development)是一种以人为核心.迭代.循序渐 ...
- jquery 绑定省份和城市
前台代码: <asp:DropDownList runat="server" ID="ddlProvince"></asp:DropDownL ...
- swift 个人笔记
swift是现代编程语言的综合体,灵活而强大. //http://www.cocoachina.com/newbie/basic/2014/0604/8675.html //语法var 变量,let ...
- oracle分区表相关
1.查询某个表各分区数据量 select count(*) from table_name partition(分区名) 可以使用sql生成所有分区查询语句: 2.分区表truncate 分区 alt ...
- rsync服务架设(数据同步|文件增量备份)
近期由于业务需要,需要将两台服务器数据保持同步.方案有很多,rsync是其中一种解决方案,本文对rsync的安装及配置进行简单说明,其他实现方式有兴趣可以研究.以下是本文提纲,供参考: rsy ...
- [C#]匿名类型的深拷贝
.net Framework 3.5 + C# 3 发布了包括LinQ等一系列功能,其中包括了匿名类型,而我们在升级到.net4后,发现原来写好的用于POCO的深拷贝方法 static object ...
- cdoj 1246 每周一题 拆拆拆~ 分解质因数
拆拆拆~ Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1246 Descri ...
- Codeforces Gym 100513D D. Data Center 前缀和 排序
D. Data Center Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/560/proble ...
- zoj3672 Gao The Sequence
原地踏步了半年,感觉一切都陌生了~ 题意:a[i]-一个任意的数,这个数要等于a[1]~a[i-1]每个数减去任意一个数,经过多次这样的变换到达目标b序列,能到达就yes不能到达距no. 一开始各种分 ...