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的消息确认有两种. 一种是消息发送确认.这种是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是 ...
随机推荐
- Linux 查看进程、清理缓存、查看磁盘空间、查看宽带的命令
一.查看进程 查看所有的进程命令:ps 查看指定的进程命令:ps -ef|grep java (java 指的是服务名称) 结束进程命令:kill -9 9028 (9028指的是PID) 二.清理 ...
- Encapsulation、Inheritance、Polymorphism
public class SoldierDemo { public static void main(String[] args) { /*Soldier test1=new Army("张 ...
- 使用xtrabackup备份mysql数据库
数据在一个企业里非常重要,因此经常需要备份数据库,确保出线故障时,可以立刻恢复数据到最新状态,目前常见的备份工具有mysqldump和xtrabackup,数据量较少时可以使用mysqldump,但随 ...
- python中zipfile文件名编码的问题
在python中编程导入压缩包,利用zipfile包,从zipinfo读取文件名总是出错,创建的文件名是乱码,写入pgsql更是出错. 但在ubuntu下测试却正常,在windows下测试总是失败. ...
- Asp.Net 利用反射获得委托和事件以及创建委托实例和添加事件处理程序
子程序定义: public delegate void CurrentControlListenEvent(string uniqueID, string way = null); public ev ...
- 我的Sharepoint母版页的使用
在Sharepoint 2010母版页文件夹里面,有一个叫v4.master的母版页文件. 在它的基础上修改成想要的母版页.我们用最少的修改完成我们想要的效果. 我们有时是要这样的一个母版页,顶部Ri ...
- Python学习之路-Day2
数据类型常用操作 不管是查整数还是查布尔或者是列表...要记住 dir(int) 查看某个类型的功能 help(int) 查看该类型的功能及文档说明 type(4) 查看某个字符或数字的类型- ...
- 一个用shell写的统计目录下统计文件行数的代码
此代码是用来回忆当初学的shell脚本,很多知识忘了,写这个花了我三个小时的时间 #!/bin/ksh #count *.c file the num of lineg_csum=0g_hsum=0 ...
- 深入浅出C#中的静态与非静态
C#语言静态类 vs 普通类 C#语言静态类与普通类的区别有以下几点: 1)C#语言静态类无法实例化而普通类可以: 2)C#语言静态类只能从System.Object基类继承:普通可以继承其它任何非 ...
- hdu 5944 Fxx and string
\:nn,下标从1开始,第\:i\:i位的字母为\:s_isi,现在Fxx想知道有多少三元组\:(i,j,k)\:(i,j,k)满足下列条件 1.i,j,k\:i,j,k三个数成等比数列 2.s ...