深入浅出JMS(二)——JMS的组成
JMS Provider
实现了JMS规范的消息系统,该系统还提供必须的用于管理和控制全方位的功能,如这里的ActiveMQ。
Administered Objects
Administered Objects是预先配置的JMS对象,由系统管理员为使用JMS的客户端创建,如ConnectionFactory、Destination。JMS 被管理的对象是包含JMS配置信息的对象,这些对象由JMS管理者创建,并且最终由JMS客户端使用。
由于有很多JMS消息系统,它们的底层实现技术各不相同,比如Sun MQ、IBM MQ、BEA MQ、Apache ActiveMQ,那么如何使得JMS客户端针对这些消息系统编程时能够隔离这些产品的变化而具有跨平台特性呢?就是通过定义被管理的对象来实现。被管理 的对象是由管理员通过使用JMS系统提供者的管理工具创建和定制,然后被JMS客户端使用。JMS客户端通过接口来调用这些被管理的对象,从而具备跨平台 特性。
主要有两个被管理的对象:ConnectionFactory、Destination
ConnectionFactory
这是客户端用来创建同JMS服务提供者之间的连接的对象。
Destination
这个对象是客户端用来指明消息被发送的目的地以及客户端接收消息的来源。被管理的对象一般被管理员放在JNDI名字空间中,通常在JMS客户端应用的文档中说明它所需要的JMS被管理对象,以及应以何种JNDI名字来提供这些JMS被管理对象。
JMS客户端
这些客户端程序通过使用JMS提供的API,来创建发送和接收消息的Java语言程序,即消息生产者和消息消费者。
消息生产者
客户端使用MessageProducer向目的地发送消息。用Queue或者Topic对象作为参数来调用session对象的createProducer方法来创建MessageProducer。
客户端也可以选择创建没有目的地的生产者。这种情况下,目的地对象必须传给每个发送操作。这种方式的一个典型用法就是生产者被用来发送回复请求时,使用请求的JMSReplyTo目的地。
客户端可指定由生产者发出的消息的缺省的传送模式、优先级、存活周期。每次客户端创建MessageProducer,它就定义了新的消息系列,这些消息与以前发送的消息没有顺序关系。
消息消费者
客户端使用MessageConsumer接受来自于目的地的消息,MessageConsumer通过向Session的createConsumer方法传递Queue或Topic来创建。
消费者可以被带有消息选择器的方式来创建。这使得客户端可以限制传送给消费者的消息必须同选择器相匹配。客户端既可以同步获取消费者的消息,也可以使提供者在消息到达时异步传送消息。
Synchronous Delivery 同步传送
客户端可以使用MessageConsumer的receive方法请求下一个来自于MessageConsumer的消息。Receive有几种变化允许客户端poll或者wait下一个消息。
Asynchronous Delivery 异步传送
客户端可以注册一个用MessageConsumer来实现JMS MessageListener接口的对象。当消息达到了消费者时,提供者通过调用监听器的onMessage方法来传送它们。可能监听器会抛出 RuntimeException异常,但是这主要考虑到的是客户端程序错误。良好的监听器应当捕捉这些异常并且尝试将这些消息转向发给一些应用指定的某 些形式的“不可处理消息”的目的地。
监听器抛出RuntimeException的结果取决于会话的确认模式:
n AUTO_ACKNOWLEDGE or DUPS_OK_ACKNOWLEDGE
消息将被立即重发。在放弃之前的重发的次数取决于提供商。在这种情况下,JMSRedelivered 消息头字段将设置在被重发的消息中。
n CLIENT_ACKNOWLEDGE
监听器的下一个消息将被传送。如果客户端希望是前面未确认的消息重新发送,它必须手工恢复会话。
n Transacted Session
监听器的下一个消息被发送,客户端可以提交或者回滚会话。(换句话说,RuntimeException不会导致会话的自动回滚)JMS服务提供者应当将消息监听器抛出异常的客户端标记为“可能的障碍”。
Message
用于在客户端之间进行通讯的消息,消息系统的核心当然是消息。JMS 为不同类型的内容提供了几种消息类型,但所有消息都是从 Message 接口派生出来的。
消息类型 |
说明 |
常用方法概览 |
TextMessage |
文本消息 |
getText,setText |
MapMessage |
映射消息 |
setString,getString |
BytesMessage |
字节消息 |
writeBytes,readBytes |
StreamMessage |
流消息 |
writeString,readString |
ObjectMessage |
对象消息 |
setObject,getObject |
表 常用消息类
Message 分为三个组成部分:
Header
是一组标准字段,客户机和提供者都用它们来标识和路由消息。
Properties
提供了一个给消息添加可选标题字段的实用工具。如果应用程序需要用标准标题字段没有提供的方法对消息进行归类或分类,那么可以为消息添加一个属性来实现这 种归类和分类;提供了 setProperty(...) 和 getProperty(...) 方法来设置和获得各种 Java 类型的属性,其中包括 Object。JMS 定义了提供者可以选择性提供的一组标准属性。
Body
包含将发送到接收应用程序的内容。每一个消息接口都专用于它所支持的内容类型。
下面列出了 Message 的每一个标题字段的名称、它对应的 Java 类型和字段的描述:
JMSMessageID——类型为 string
惟一标识提供者发送的每一条消息。这个字段是在发送过程中由提供者设置的,客户机只能在消息发送后才能确定消息的 JMSMessageID。
JMSDestination——类型为 Destination
消息发送的 Destination,在发送过程中由提供者设置。
JMSDeliveryMode—类型为 int
包含值 DeliveryMode.PERSISTENT 或者 DeliveryMode.NON_PERSISTENT。持久性消息被传输并且只被传输一次,非持久性消息最多被传输一次。要知道“最多一次”包括根本 不传输。非持久性消息在应用程序或者系统出故障时被提供者弄丢。因此要格外小心,确保持久性消息不受故障的影响。这比开销通常被认为是发送持久性消息方面 的开销,在决定消息的发送模式时,必须仔细考虑,在可靠性和性能之间进行权衡。
JMSTimestamp——类型为 long
提供者发送消息的时间,由提供者在发送过程中设置。
JMSExpiration——类型为 long
消息失效的时间。这个值是在发送过程中计算的,是发送方法的生存时间(time-to-live)值和当前时间值的和。提供者不应发送过期的消息。值 0 表明消息不会过期。
JMSPriority——类型为 int
消息的优先级,由提供者在发送过程中设置。优先级 0 的优先级最低,优先级 9 的优先级最高。
JMSCorrelationID——类型为 string
通常用来链接响应消息与请求消息,由发送消息的 JMS 程序设置。响应来自另一个 JMS 程序的消息的 JMS 程序将正响应消息的 JMSMessageID 拷贝到这个字段中,这样,正作出响应的程序就可以与它所发出的特定请求的响应相关联。
JMSReplyTo—类型为 Destination
请求程序用它来指出回复消息应发送的地方,由发送消息的 JMS 程序设置。
JMSType—类型为 string
JMS 程序用它来指出消息的类型。一些提供者维护着一个消息类型仓库,并用该字段引用仓库中的定义类型,在这里,JMS 程序不应该使用这个字段。
JMSRedelivered——类型为 boolean
指出消息被过早地发送给了 JMS 程序,程序不知道消息的接收者是谁;由提供者在接收过程中设置。
深入浅出JMS(二)——JMS的组成的更多相关文章
- 深入浅出 JMS(二) - ActiveMQ 入门指南
深入浅出 JMS(二) - ActiveMQ 入门指南 上篇博文深入浅出 JMS(一) – JMS 基本概念,我们介绍了消息通信的规范JMS,这篇博文介绍一款开源的 JMS 具体实现-- Active ...
- 深入浅出JMS(二)--ActiveMQ简单介绍以及安装
现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...
- 深入浅出 JMS(一) - JMS 基本概念
深入浅出 JMS(一) - JMS 基本概念 一.JMS 是个什么鬼 JMS 是 Java Message Service 的简称,即 Java 消息服务.什么是消息服务呢,我们来看一下 Oracle ...
- 深入浅出JMS(一)--JMS基本概念
from:http://blog.csdn.net/jiuqiyuliang/article/details/46701559 深入浅出JMS(一)--JMS基本概念 标签: jmsmessagin ...
- ActiveMQ学习笔记(二) JMS与Spring
上文可见,JMS Native API使用起来不是特别方便.好在Spring提供了很好的JMS支持. (一)配置ConnectionFactory 如果使用连接池的话,不要忘记activemq-poo ...
- ActiveMQ之二--JMS消息类型
1.前言 //发送文本消息 session.createTextMessage(msg); //接受文本消息 public void onMessage(Message msg) { TextMess ...
- Spring整合JMS(二)——三种消息监听器
原文地址:http://haohaoxuexi.iteye.com/blog/1893676 1.3 消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监 ...
- Spring整合JMS(二)——三种消息监听器(转)
*注:别人那复制来的 1.3 消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageList ...
- 消息中间件JMS(二)
之前介绍了ActiveMQ下载与安装,并且启动了.下面进行ActiveMQ的Demo 1. JMS入门Demo 1.1 点对点模式 点对点模式主要建立在一个队列上面,当连接一个队列的时候,发送端不需要 ...
- ActiveMQ (二) JMS入门
JMS入门 前提:安装好了ActiveMQ ActiveMQ安装 Demo结构: 首先pom.xml引入依赖: <dependency> <groupId>org.apach ...
随机推荐
- ADT在线安装
以往安装ADT根本就不是个问题,可是现在就是个大问题了,联通的宽带网络连www.google.com.hk都打不开,你叫我们这些P民怎么活? https://dl-ssl.google.com/and ...
- python--字符工厂函数dict()
字符工厂函数str() class str(object): """ str(object='') -> str str(bytes_or_buffer[, enc ...
- C++ (P70—P96)
1 类的成员默认为私有模型 2 类的声明内不允许对数据成员进行初始化 3 类的成员函数,如果在类外定义,只需在函数类型之前加上inline就为内联函数了,如果在类内定义函数则该函数自动成为内联成员函数 ...
- RadioGroup&RadioButton
RadioGroup提供多选一机制:属性orientation:“vertlcal” or “horizontal” @Override public void onCheckedChanged(Ra ...
- java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序
过滤器拦截到响应url的请求后会先执行doFilter()方法中chain.doFilter()之前的代码,然后执行下一个过滤器或者servelt.紧接着执行chain.doFilter()之后的代码 ...
- Ubuntu lnmp安装记录
参考了: Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL 在访问 info.php的时候,我显示的是502错误.后面我参考了: Ubuntu15 ...
- BFC引发的关于position的思考
BFC布局规则: 内部的Box会在垂直方向,一个接一个地放置. Box垂直方向的距离由margin决定.属于同一个BFC的两个相邻Box的margin会发生重叠 每个元素的margin box的左边, ...
- ###再探Makefile
使用makefile.以前刚开始接触Makefile的时候,写过一个最简单的Makefile.点击查看Evernote原文. #@author: gr #@date: 2014-07-20 #@ema ...
- IOS-UI-UIDynamic(二)
UIPushBehavior :推动效果 UIAttachmentBehavior:附着效果 UISnapBehavior:迅速移动效果 一.重要的属性 UIPushBehavior :推动效果 ty ...
- 12天学好C语言——记录我的C语言学习之路(Day 8)
12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...