JMS确认机制
JMS中为数不多的重点就是消息的确认机制,下面分别介绍J2EE和Spring的MessageListenerContainer的确认机制
J2EE中JMS确认机制
在JMS规范中一共4种确认方式
AUTO_ACKNOWLEDGE当调用recieve方法成功后或MessageListener处理函数成功返回后进行确认
CLIENT_ACKNOWLEDGE客户端通过message的acknowledge方法手动确认
DUPS_OK_ACKNOWLEDGE延迟确认,在对重复接受同一消息不敏感时可以选用此确认模式,相比AUTO_ACKNOWLEDGE有性能提升
SESSION_TRANSACTED调用session的commit或rollback进行事务式确认
Spring中的确认机制
多数情况下会使用Spring集成相关JMS的操作,可以减少相关开发的复杂度,但是Spring的确认方式和默认的JMS确认方式有些许不同,根据官方API
AUTO_ACKNOWLEDGE(默认):这个模式依赖于具体的实现,DefaultMessageListenerContainer中是在调用listener方法之前确认,SimpleMessageListenerContainer是在listener返回后确认,但是即使listener抛出异常,是不会重发的。
DUPS_OK_ACKNOWLEDGE延迟确认,同样也不会对用户异常进行重发
CLIENT_ACKNOWLEDGE当listener抛出异常时会进行重发
基于事务的确认将sessionTransacted设置为true,会在listener抛出异常进行重发,同时这也是spring推荐使用的方式
可以看出Spring的AUTO_ACKNOWLEDGE方式并不会关心listener抛出的异常,这个和J2EE的在listener成功返回后确认有所区别。
SpringJMS相关实现
下面看下SpringJMS MessageListenerContainer的继承树
Object
|-JmsAccessor
|-JmsDestinationAccessor
|-AbstractJmsListeningContainer
|-AbstractMessageListenerContainer
|-AbstractPollingMessageListenerContainer
|-DefaultMessageListenerContainer
|-SimpleMessageListenerContainer
|-SimpleMessageListenerContainer
如上面介绍的DefaultMessageListenerContainer和SimpleMessageListenerContainer是两个不同的分支,
前者继承了AbstractPollingMessageListenerContainer,从名字可以看出这个是客户端polling来获得消息的,也就是使用recieve方法,所以在API中说是在listener方法执行前确认的
后者是直接封装了MessageListener进行调用,但是对用户代码进行了异常控制所以就算抛出异常也不会进行重发,这个也许是为了统一AUTO_ACKNOWLEDGE的行为吧。
总结
spring默认的JMS确认方式是无法保证在用户代码出现异常时进行重发的(如OOM的情况等),这样会导致消息的丢失,在某些场景这个是不可接受的,所以使用中需要注意选用适当的确认方式进行JMS开发
JMS确认机制的更多相关文章
- AMQ学习笔记 - 16. 确认机制的测试
概述 对Acknowledge机制进行测试. 此处的测试是针对Consumer的确认设计的:对于Producer的确认是透明的,无法提供测试. 测试实例 设计demo,测试三种确认机制. 测试机制 测 ...
- activemq的消息确认机制ACK
一.简介 消息消费者有没有接收到消息,需要有一种机制让消息提供者知道,这个机制就是消息确认机制. ACK(Acknowledgement)即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符 ...
- JAVA消息确认机制之ACK模式
JMS API中约定了Client端可以使用四种ACK模式,在javax.jms.Session接口中: AUTO_ACKNOWLEDGE = 1 自动确认 CLIENT_ACKNOWLEDGE ...
- Activemq消息确认机制 --转载
转自:http://blog.csdn.net/czp11210/article/details/47022639 ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息存 ...
- RabbitMQ 消息确认机制
消息确认机制 在之前异常处理部分就已经写了,对于consumer的异常退出导致消息丢失,可以时候consumer的消息确认机制.重复的就不说了,这里说一些不一样的. consumer的消息确认机制 当 ...
- (转)RabbitMQ消息队列(九):Publisher的消息确认机制
在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...
- RabbitMQ消息队列(九):Publisher的消息确认机制
在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...
- RabbitMQ消息队列(六)-消息任务分发与消息ACK确认机制(.Net Core版)
在前面一章介绍了在.Net Core中如何使用RabbitMQ,至此入门的的部分就完成了,我们内心中一定还有很多疑问:如果多个消费者消费同一个队列怎么办?如果这几个消费者分任务的权重不同怎么办?怎么把 ...
- RabbitMQ的消息确认机制
一:确认种类 RabbitMQ的消息确认有两种. 一种是消息发送确认.这种是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是 ...
随机推荐
- IE9下WebUploader上传图片跨域问题
作为前端,这一次踩到后台xml配置的坑. IE9下上传图片通过flash插件,一直发送http://192.168.0.8:8888/crossdomain.xml请求,状态码为404,原因是上传图片 ...
- sqlserver开启'xp_cmdshell'命令
--sql server中开启xp_cmdshell命令 1. --允许配置高级选项 GO RECONFIGURE GO . --开启xp_cmdshell服务 RECONFIGURE GO . -- ...
- 安装双系统window +ubuntu
在网上,试过很多种方法,有U盘制作安装,感觉好复杂,这边有一个简便的方法就是使用Ubuntu 的 wubi安装. 一直想安装双Ubuntu 系统很久了,可是以前在大学时期的时候一直努力,好像都不行,这 ...
- JS 获取FileUpload1控件地址
function openList() { //判断浏览器类型 var isIE = (document.all) ? true : false; ); ); ); var path = " ...
- 【洛谷·P2320】鬼谷子的钱袋
这道题很神奇 我们举一个例子,m=12 那么我们可以把它分成两部分,L和R: (1,2,,6)(7,8,,12) 我们可以发现R中的数都可以由12/2和左边的数组合得到 那么我们对L再分------ ...
- 【洛谷P2889】Milking Time
很容易想到以结束时间加上R从小到大排序 之后怎样呢? 我们按层考虑,f[i]表示前i个时间段嫩得到的最大价值 每次枚举其之前的状态,如果其ed<当前i的st,那么取max即可 #include& ...
- VMware 12 的vmware tools安装和如何使用(系统是CENTOS6.5)
1.用了一下虚拟机vmware12,但是总是没法使用它的vmware Tool ,网上一直说在哪个哪个文件夹,其实并没有 2.于是我用命令行找到了在系统中的VMware Tools 3.首先,保证li ...
- 287. Find the Duplicate Number hard
287. Find the Duplicate Number hard http://www.cnblogs.com/grandyang/p/4843654.html 51. N-Queens h ...
- oracle入门必备
//................创建表空间 \ 赋予角色 \ 创建数据表 \ 插入数据 \ 创建序列 \ 添加注释 ........................... --创 ...
- mysql 服务windows安装
找到mysql的bin目录,下面有一个mysqld.exe程序,这是用来启动mysql服务的,直接运行即可启动. 还有安装windows服务方式: mysqld.exe -install -manua ...