将介绍的内容是: 控制消息确认、为发送消息指定选项、创建临时目的地、使用JMS本地事务、异步发送消息 五个方面。

1.控制消息确认

在JMS消息得到确认之前,并不认为它已经成功使用。要成功使用消息,通常分为三个阶段:

(1)、客户端接收消息。

(2)、客户端处理消息。

(3)、消息得到确认。确认可能由JMS提供者发出、或者由客户端发出、这取决于会话确认模式。

在本地事务性会话中,会话提交时消息就会得到确认。如果一个事务回滚,则已使用的所有消息都会重新发送。

在非事务性会话中。消息何时确认,以及如何确认取决于一个值。这个值可能作为createContext方法(JDK定义的接口为: public abstract JMSContext createContext(int i);)的一个参数来指定。可能的参数值为:

JMSContext.AUTO_ACKNOWLEDGE:这是应用客户端和java SE客户端默认设置。客户端成功地从一个receive调用返回时或者用来处理消息所调用的MessageListener成功返回时,JMS会自动确认客户端接收到一个消息。

JMSContext.CLIENT_ACKNOWLEDGE :客户端通过调用acknowledge方法来确认一个消息,通过这种模式,确认在会话级发生。确认使用了一个消息,也就自动确认了会话所使用的所用消息都都已经接收。例如,一个消息消费者消费了10个消息,然后对发送的第5个消息进行了确认,那么所有消息都得到了确认。

JMSContext.DUPS_OK_ACKNOWLEDGE:指示JMSContext采用懒惰方式确认消息的传送。如果JMS提供者失败,这很可能导致传送了一些重复消息,所以只有可以容忍重复消息的消费者才能使用这个模式,(如果JMS提供者传送了一个消息,就必须将JMSRedelivered消息首部的值设置为true。)这个选项可以尽量会话为避免重复所做的工作,从而降低会话开销。

2.为指定消息发送选项

发送消息时可以设置很多选项,利用这些选项可以完成以下任务:

指定消息持久化,这意味着即使提供者失败,消息也不会丢失。

指定消息的优先级,这会影响传送消息的顺序。

为消息指定一个到期时间,保证如果消息到期就不再传送。

为消息指定一个传送延迟,使消息在经过一个指定的时间之后才会传送。

使用JMSProducer方法串链

(1)、指定消息持久化

使用JMSProducer接口的setDeliveryMode方法,为这个生产者发送的所有消息设置传送模式。

模式有两种:

PERSISTENT:(这是默认的传送方式)这种模式是JMS提供者在消息提供的过程中即使JMS提供者失败,消息也不会丢失。采用这种模式发送消息,消息在发送时会存储到一个指定的位置。

NON_PERSISTENT:传送模式不要求JMS提供者存储消息,也不用保证提供者失败时消息不丢失

如果没有指定传送模式,则默认指定模式是PERSISTENT。使用NON_PERSISTENT传送模式可以提高性能,减少存储开销,不过只有当应用能够允许应用丢失消息时才能使用这个模式。

JDK中DeliveryMode接口关于这两个模式定义:

(2)、设置消息优先级

使用消息优先级指示JMS消息提供者先发送紧急的消息,使用JMSProducer接口的setPriority方法来为这个生产者所发送的所有消息来设置优先级。JDK源码为 (参数是毫秒)

优先级总共有十个级别从0到9逐渐增高,默认级别是4,JMS提供者会尝试优先传送高优先级的消息,然后再传送低优先级消息,不过并不一定按照优先级顺序来传送消息,类似java并发中的优先级规则。

(3)、允许消息到期

默认的消息永远不会到期,不过一个消息再指定的一段时间后过期,则可能希望设置一个到期时间,使用JMSProducer接口中的setTimeToLive方法来为这个生产者所发送的所有消息设置一个默认的到期时间。

发送消息时会将指定的setTimeToLive加上当前时间来得到到期时间,在指定的到期时间之前未能及时传送的所有消息将被撤销。撤销过期的消息可以节省存储空间和计算资源。

(4)、指定传送延迟

使用JMSProducer接口中的setDeliveryDelay方法为这个生产者所发送的所有消息设置一个传送延迟。即指定一个消息发送之后并在JMS提供者传送这个消息之前所要经过的时间。说白点即是给生产者设置个延迟时间,让它等准备完之后过一个延迟时间再发送。

(5)、使用JMSProducer方法串链

JMS接口的设置方法会返回JMSProducer对象,可以使用方法串链来创建一个生产者,设置多个属性,然后发送一个消息。

3.创建临时目的地

创建临时目的地(TemporaryQueue和TemporaryTopic对象),使用JMSContext.createTemporaryQueue和JMSContext .createTemporaryTopic方法动态地创建这些临时目的地,它们的存在时间只限于创建它们的连接所保持的时间。只有创建该临时目的地的连接上的消息消费者才能够从临时目的地中提取消息。任何消息生产者都可以向临时目的地发送消息,如果关闭了一个临时目的地的连接,这个目的地也会关闭,它的内容会丢失。

4.使用JMS本地事务

事务是将一系列操作分组到一个原子工作单元中。如果任意一个操作丢失,整个事务就会回滚,这些操作可能会从头重新执行。如果所有操作都成功,事务就可以提交。

在一个应用客户端或Java SE客户端中,可以使用本地事务对消息发送和接收分组。使用JMSContext.commit方法来提交事务。一个事务可以发送多个消息,在事务提交之前,这些消息不会真正增加到队列或主题。如果一个事务中接收多个消息,则事务提交之前不会得到确认。

使用JMSContext.rollback方法回滚一个事务。事务回滚意味着所有消息都被撤销,所有已经使用的消息会恢复并重新传送,除非它们已经到期。

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

5.异步发送消息

发送一个持久化消息时,send方法会阻塞,直到JMS消息提供者确认这个消息已经成功发送。异步发送机制则允许应用发送一个消息,在等待发送是否完成的同时,可以继续完成自动自己的工作。

异步发送一个消息需要一个回调对象。利用CompletionListener实例化一个listener监听器对象,进行对发送的消息一直监听,如果消息发送失败,则调用OnException方法,如果消息发送成功,则调用OnCompletion方法 。CompletionListener类必须实现OnException和OnCompletion方法。

参考《Java EE 权威指南 卷2》

java消息服务学习之JMS高级特性的更多相关文章

  1. java消息服务学习之JMS概念

    JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. ...

  2. MQ消息队列(2)—— Java消息服务接口(JMS)

    一.理解JMS   1.什么是JMS?         JMS即Java消息服务(Java Message Service)应用程序接口,API是一个消息服务的标准或者说是规范,允许应用程序组件基于J ...

  3. Java消息服务

    什么是消息? 消息是可编程实现两端通信的机制.通常的一些消息技术如:TCP/IP Sockets.管道.文件.共享存储. Java消息服务 Java消息服务,即Java Message Service ...

  4. ActiveMQ学习总结(5)——Java消息服务JMS详解

    JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业消息系统可以协助应用软件通过网络进行消息交互. JMS的编程过程很简单,概 ...

  5. JMS(Java消息服务)入门教程

    什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...

  6. 1,Java消息服务-JMS

    一,消息服务 消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持应用程序开发.在Java中,当两个应用程序使用JMS ...

  7. JMS(Java消息服务)入门教程(一)

    什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...

  8. Java消息服务初步学习(基于Spring In Action的整理)

    几个名词 Java消息服务(Java Message Service)是一个Java标准,定义了使用消息代理的通用API. 消息代理(message broker):类似于邮局的作用,确保消息被投递到 ...

  9. JMS(Java消息服务)与消息队列ActiveMQ基本使用(一)

    最近的项目中用到了mq,之前自己一直在码农一样的照葫芦画瓢.最近几天研究了下,把自己所有看下来的文档和了解总结一下. 一. 认识JMS 1.概述 对于JMS,百度百科,是这样介绍的:JMS即Java消 ...

随机推荐

  1. AJAX-快速上手(四个步骤)

    ## 1, ajax ajax是使用js进行在不重新加载页面的情况下,使得页面局部刷新.而传统的页面加载即需要,重新加载整个页面.它的加载是异步进行的,即在加载的同时,页面的其他部分可以正常使用,不会 ...

  2. maven入门概念及使用

    Maven 一.Maven概念 1.maven是什么:Maven 是一个项目管理工具.它负责管理项目开发过程中的几乎所有的东西. 版本.构建.输出物管理.依赖关系.文档和构建结果.项目关系.移植性管理 ...

  3. 将整数m的各位数字保存到数组A中

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/4 20:10 * @description ...

  4. python自动化打开网页

    from selenium.webdriver.firefox.options import Options as FOptionsfrom selenium.webdriver.chrome.opt ...

  5. Building gRPC Client iOS Swift Note Taking App

    gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...

  6. Android的ViewPager的学习

    这篇博客是对慕课网上看到的视频里学习到的知识的一些记录,让自己能够加深理解.视频地址:http://www.imooc.com/learn/1116 在这个视频中,目标是实现类似微信的主界面之间的切换 ...

  7. composer相关使用

    #composer安装 curl -sS https://getcomposer.org/installer | php #如果该命令执行不了,通过其他方式下载install文件后再执行“php in ...

  8. MFC 修改标题

    1. Overwrite CMainFrame::PreCreateWindow. Clear the style FWS_ADDTOTITLE cs.style &= ~(LONG)FWS_ ...

  9. spring-boot logback配置

    接着上篇的代码,日志在不同环境下的配置也不一样,所以要分开配置,主要使用maven的profile 1.1 在pom.xml中添加 <profiles> <profile> & ...

  10. jQuery 选择具有特殊属性的元素

    如今有这样一种需求,须要选出全部有背景图片的元素. 这个问题有点棘手.我们无法使用选择表达式来完毕这个问题了. 使用jQuery的DOM过滤方法filter(),能够依据函数中表达的不论什么条件选择元 ...