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 ...
随机推荐
- Educational Codeforces Round 10 D. Nested Segments (树状数组)
题目链接:http://codeforces.com/problemset/problem/652/D 给你n个不同的区间,L或者R不会出现相同的数字,问你每一个区间包含多少个区间. 我是先把每个区间 ...
- 11道php面试题
贡献11道php面试题及解决方法,跟大家总结一下曾经遇到的部分面试题.希望可以给大家得到帮助. 1. 什么事面向对象?主要特征是什么? 面象对象是把自然界的物体和概念直接映射到程序界的一种比较优雅的手 ...
- python dict{}和set([])
200 ? "200px" : this.width)!important;} --> 介绍 dict(dictionary),在其他语言中也称为map,使用键-值(key- ...
- Bootstrap栅格系统(布局)
栅格系统(布局) Bootstrap内置了一套响应式.移动设备优先的流式栅格系统,随着屏幕设备或视口(viewport)尺寸的增加,系统会自动分为最多12列. 我在这里是把Bootstrap中的栅格系 ...
- 【转】shell脚本处理字符串的常用方法
转自:http://blog.csdn.net/linfeng999/article/details/6661233 1. 构造字符串 直接构造 STR_ZERO=hello #shell中等号左右的 ...
- delphi 14 内容编辑
撤销 重做 - 复制 剪切 粘贴 删除 - 全选 不选 ///编辑 ///撤销 WebBrowser1.ExecWB(OLECMDID_REDO ,1); ///重做 WebB ...
- 【Android】利用服务Service创建标题栏通知
创建标题栏通知的核心代码 public void CreateInform() { //定义一个PendingIntent,当用户点击通知时,跳转到某个Activity(也可以发送广播等) Inten ...
- Office 365 Certificate Exam Resources
70-321 Deploying Office 365 Deploying Office 365 Jump Start (01): Infrastructure Planning Deploying ...
- C++标准转换运算符const_cast
前面讲了C++继承并扩展C语言的传统类型转换方式,最后留下了一些关于指针和引用上的转换问题,没有做详细地讲述.C++相比于C是一门面向对象的语言,面向对象最大的特点之一就是具有“多态性(Polymor ...
- 使用Areas(区域)分离ASP.NET MVC 项目
在使用Areas区域时,如果使用默认路由表,将造成路由表冲突,这种情况需要修改一下区域内<区域名称>AreaRegistration.cs和/App_Start/RouteConfig.a ...