ActiveMQ(03):JMS的可靠性机制

一、消息接收确认

JMS消息只有在被确认之后,才认为已经被成功地消费了。消息的成功消费通常包含三个阶段:客户接收消息、客户处理消息和消息被确认。

事务相关

1、在事务性会话中,当一个事务被提交的时候,确认自动发生。

    final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
    ....
    session.commit();

2、在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。

该参数有以下三个可选值:

Session.AUTO_ACKNOWLEDGE:

当客户成功的从receive方法返回的时候,或者从MessageListener.onMessage方法成功返回的时候,会话自动确认客户收到的消息。

         final Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
         ...
         MapMessage message = (MapMessage) consumer.receive();

Session.CLIENT_ACKNOWLEDGE:

客户通过调用消息的acknowledge方法确认消息。

需要注意的是,在这种模式中,确认是在会话层上进行,确认一个被消费的消息将自动确认所有已被会话消费的消息。

例如,如果一个消息消费者消费了10个消息,然后确认第5个消息,那么所有10个消息都被确认。

       final Session session = connection.createSession(Boolean.FALSE, Session.CLIENT_ACKNOWLEDGE);
       ...
       while(i<3) {
		MapMessage message = (MapMessage) consumer.receive();
		System.out.println("收到消息:" + message.getString("nro3---" + i) + ", poperty : " + message.getStringProperty("orderId" + i));
		if (i == 2) {
		 message.acknowledge();
		}
		i++;
	   }

Session.DUPS_OK_ACKNOWLEDGE:

该选择只是会话迟钝的确认消息的提交。

如果JMSprovider失败,那么可能会导致一些重复的消息。

如果是重复的消息,那么JMSprovider必须把消息头的JMSRedelivered字段设置为true

二、消息持久性与消息优先级

2.1 消息持久性

JMS支持以下两种消息提交模式:

PERSISTENT:指示JMS provider持久保存消息,以保证消息不会因为JMSprovider的失败而丢失

NON_PERSISTENT:不要求JMS provider持久保存消息

2.2 消息优先级

可以使用消息优先级来指示JMS provider首先提交紧急的消息。

优先级分10个级别,从0(最低)到9(最高)。如果不指定优先级,默认级别是4。

需要注意的是,JMS provider并不一定保证按照优先级的顺序提交消息

三、消息过期与消息的临时目的地

3.1 消息过期

可以设置消息在一定时间后过期,默认是永不过期。

3.2 消息的临时目的地

可以通过会话上的createTemporaryQueue方法和createTemporaryTopic方法来创建临时目的地。它们的存在时间只限于创建它们的连接所保持的时间。

只有创建该临时目的地的连接上的消息消费者才能够从临时目的地中提取消息

四、持久订阅

生产者必须使用PERSISTENT提交消息。

客户可以通过会话上的createDurableSubscriber方法来创建一个持久订阅,该方法的第一个参数必须是一个topic。第二个参数是订阅的名称。

JMS provider会存储发布到持久订阅对应的topic上的消息。如果最初创建持久订阅的客户或者任何其它客户,使用相同的连接工厂和连接的客户ID,

相同的主题和相同的订阅名,再次调用会话上的createDurableSubscriber方法,那么该持久订阅就会被激活。JMS provider会向客户发送客户处于非激活

状态时所发布的消息。

持久订阅在某个时刻只能有一个激活的订阅者。持久订阅在创建之后会一直保留,直到应用程序调用会话上的unsubscribe方法。

五、本地事务

在一个JMS客户端,可以使用本地事务来组合消息的发送和接收。JMSSession接口提供了commit和rollback方法。

事务提交意味着生产的所有消息被发送,消费的所有消息被确认;

事务回滚意味着生产的所有消息被销毁,消费的所有消息被恢复并重新提交,除非它们已经过期。

事务性的会话总是牵涉到事务处理中,commit或rollback方法一旦被调用,一个事务就结束了,而另一个事务被开始。关闭事务性会话将回滚其中的事务。

注意:

1、如果使用请求/回复机制,即发送一个消息,同时希望在同一个事务中等待接收该消息的回复,那么程序将被挂起,因为知道事务提交,发送操作才会真正执行。

2、消息的生产和消费不能包含在同一个事务中。

时间: 2024-10-16 23:25:57

ActiveMQ(03):JMS的可靠性机制的相关文章

ActiveMQ:JMS开源框架入门介绍

介绍基本的JMS概念与开源的JMS框架ActiveMQ应用,内容涵盖一下几点: 基本的JMS概念 JMS的消息模式 介绍ActiveMQ 一个基于ActiveMQ的JMS例子程序 一:JMS基本概念 1. JMS的目标 为企业级的应用提供一种智能的消息系统,JMS定义了一整套的企业级的消息概念与工具,尽可能最小化的Java语言概念去构建最大化企业消息应用.统一已经存在的企业级消息系统功能. 2. 提供者 JMS提供者是指那些完全完成JMS功能与管理功能的JMS消息厂商,理论上JMS提供者完成.

Oozie 使用ActiveMQ实现 JMS通知

一,介绍 提交给Oozie的作业,作业在运行过程中的状态会发生变化如:执行成功了,或者失败了……Oozie能够监控这些作业状态的改变并且将这些消息发送到JMS消息服务器.这里,使用ActiveMQ作为JMS消息服务器. Oozie supports publishing notifications to a JMS Provider for job status changes and SLA met and miss events. For Oozie to send/receive mess

【iScroll源码学习03】iScroll事件机制与滚动条的实现

[iScroll源码学习03]iScroll事件机制与滚动条的实现 前言 想不到又到周末了,周末的时间要抓紧学习才行,前几天我们学习了iScroll几点基础知识: 1. [iScroll源码学习02]分解iScroll三个核心事件点 2. [iScroll源码学习01]准备阶段 3. [iScroll源码学习00]模拟iScroll 今天我们来学习其事件机制以及滚动条的实现,完了后我们iScroll就学习的差不多了,最后会抽离iScroll的精华部分组成一个阉割版iScroll 并总结下iScr

JMS消息的可靠性机制

ActiveMQ消息签收机制: 客户端成功接收一条消息的标志是一条消息被签收,成功应答. 消息的签收请求分为两种: 1.带事务的session 如果session带有事务,并且事务成功提交,则消息被自动签收.如果事务回滚,则消息会被再次传送. 2.不带事务的session 不带事务的session的签收方式,取决于session的配置 ActiveMQ支持以下三种模式: Seesion.AUTO_ACKNOWLEDGE:消息自动签收: Session.CLIENT_ACKNOWLEDGE:客户端

框架面试题(maven、ZooKeeper、Dubbo、Nginx、Redis、Lucene、Solr、ActiveMQ、JMS

什么是 Maven? Maven 使用项目对象模型(POM)的概念,可以通过一小段描述信息来管理项目的构建, 报告和文档的软件项目管理工具. Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具.由于 Maven 的 缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项 目.由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发布时使用 Maven,而 且公司项目采用 Maven 的比例在持续增长. Maven 的出现,解决了

基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送

写了一个简单的JMS例子,之所以使用JNDI 是出于通用性考虑,该例子使用JMS规范提供的通用接口,没有使用具体JMS提供者的接口,这样可以保证我们编写的程序适用于任何一种JMS实现(ActiveMQ.HornetQ...). 什么是JNDI JNDI(Java Naming and Directory Interface)是一个标准规范,类似于JDBC,JMS等规范,为开发人员提供了查找和访问各种命名和目录服务的通用.统一的接口.J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的

JMS消息传输机制

JMS消息传送模型: 消息传送机制, 是基于拉取(pull)或者轮询(polling)的方式.  JMS具备两种"消息传送模型": P2P和Pub/sub. (1) P2P:点对点消息传送模型, 允许JMS客户端通过队列(queue)这个虚拟通道来同步或异步发送消息; 消息的生产者为Sender, 消费者为receiver.   receiver主动到队列中请求消息,而不是JMS提供者将消息推送到客户端;   主要原因是一个队列通道可能有多个receiver,每个receiver可能对

03.JMS深入

1.JMS API JMS API可以分为3个主要部分:公共API.点对点API和发布/订阅API.在JMS1.1中,公共API可被用于向一个队列或主题发送消息,或从其中接收消息.点对点API专门用于使用队列的消息传送,而发布/订阅API则专门用于使用主题的消息传送. 1.JMS公共API 在JMS公共API内部,和发送与接收JMS消息有关的JMS API接口主要有7个: ConnectionFactory - 一个创建连接的连接工厂 Destination - 消息目的地,可以是queue(队

使用activeMQ实现jms

一:jms介绍         jms说白了就是java message service,是J2EE规范的一部分,跟jdbc差不多,sun只提供了接口,由各个厂商(provider)来进行具体的实现,然后使用者使用他们的jar包进行开发使用即可.        另外在jms的API中,jms传递消息有两种方式,一种是点对点的Queue,还有一个是发布订阅的Topic方式.区别在于:        对于Queue模式,一个发布者发布消息,下面的接收者按队列顺序接收,比如发布了10个消息,两个接收者