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确认机制的更多相关文章

  1. AMQ学习笔记 - 16. 确认机制的测试

    概述 对Acknowledge机制进行测试. 此处的测试是针对Consumer的确认设计的:对于Producer的确认是透明的,无法提供测试. 测试实例 设计demo,测试三种确认机制. 测试机制 测 ...

  2. activemq的消息确认机制ACK

    一.简介 消息消费者有没有接收到消息,需要有一种机制让消息提供者知道,这个机制就是消息确认机制. ACK(Acknowledgement)即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符 ...

  3. JAVA消息确认机制之ACK模式

    JMS API中约定了Client端可以使用四种ACK模式,在javax.jms.Session接口中: AUTO_ACKNOWLEDGE = 1    自动确认 CLIENT_ACKNOWLEDGE ...

  4. Activemq消息确认机制 --转载

      转自:http://blog.csdn.net/czp11210/article/details/47022639 ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息存 ...

  5. RabbitMQ 消息确认机制

    消息确认机制 在之前异常处理部分就已经写了,对于consumer的异常退出导致消息丢失,可以时候consumer的消息确认机制.重复的就不说了,这里说一些不一样的. consumer的消息确认机制 当 ...

  6. (转)RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  7. RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  8. RabbitMQ消息队列(六)-消息任务分发与消息ACK确认机制(.Net Core版)

    在前面一章介绍了在.Net Core中如何使用RabbitMQ,至此入门的的部分就完成了,我们内心中一定还有很多疑问:如果多个消费者消费同一个队列怎么办?如果这几个消费者分任务的权重不同怎么办?怎么把 ...

  9. RabbitMQ的消息确认机制

    一:确认种类 RabbitMQ的消息确认有两种. 一种是消息发送确认.这种是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是 ...

随机推荐

  1. VS2012常用快捷键

    Ctrl+K,D ----格式化全部代码 Ctrl+K,F ----格式化选中的代码 Ctrl+K,C ----注释选定内容 Ctrl+K,U ----取消注释选定内容 Ctrl+J或者 Ctrl+S ...

  2. Oracle 11g 导库导不出空表问题

    Oracle11g 会遇到这样的问题,用exp整库导出的时候,会遇到这样的问题,库里的空表没办法导出 select * from all_all_tables aa where aa.owner='U ...

  3. Java编程中“为了性能”尽量要做到的一些地方

    最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...

  4. js 根据名字获取cookie 的方法

    function getcookie(c_name) { if (document.cookie.length > 0) { c_start = document.cookie.indexOf( ...

  5. navicat自动备份数据

    1.打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击"计划",再点击"新建批处理作业". 2.双击上面的可用任务,它就会到下面的列表 ...

  6. npm ERR publish 403,nodejs发布包流程

    nodejs学习体验之发布包,发布环境如下:1:win10系统,2:已安装nodejs. 具体操作步骤如下: *编写模块 1)新建文件夹,比如:somepackage 2) 该文件夹下新建js文件,比 ...

  7. 总结一下使用react-native的一些入门级重要点

    经过多方的协调沟通,我们决定至4.1日起,停止向新用户透出该服务:今年10.15以后,老用户也停止该服务(具体表现是网站上传APK-Android或者URL-iOS入口会下掉,已经发版的App,SDK ...

  8. 虚拟机安装LINUX网络配置注意的问题

    1.如果你配置本地IP,不上网,网卡选项可以选择仅主机模式,如果要上网,就直接选择桥接模式,复制物理网络这个选项 2.将NET1网卡(仅主机模式)选中,然后进入下面这个配置选项   上面方框内的IP段 ...

  9. [UE4]逻辑状态机组件

    逻辑状态机 为了实现对目标状态的控制,以及广播改变状态后的事件,可在蓝图中继续处理不同状态下的行为. 实现过程: 1.继承ActorComponent实现LogicStateMachine: 2.被击 ...

  10. js 监听输入框输入事件兼容ie7

    $(element).bind("input propertychange",function(){});