JMS学习笔记
JSR914
JMS 为 Java 程序提供了一种创建、发送、接收和读取企业消息系统中消息的通用方法。
“消息”是指被企业应用而不是人所消费的异步的请求、报告以及事件。
Messages(消息):每个应用定义了用于在客户端之间进行通讯的消息。
同步消费者显式调用方法来获取消息,异步消费者指定一个回叫方法来处理消息。
JMS 基于一套通用的消息概念。每个JMS消息域(PTP 和Pub/Sub)也都定义了一套自己概念的接口。JMS 通用接口则提供了不依赖于PTP和Pub/Sub消息域的能力。
ConnectionFactory :被管理的对象,由客户端使用,用来创建一个连接。 (这是客户端用来创建同 JMS提供者之间的连接的对象。)
Connection:一个到JMS消息系统提供者的活动连接。
Destination :一个被管理对象,封装了消息目的地的标识。(这个对象是客户端用来指明消息被发送的目的地以及客户端接收消息的来源。 )
Session - a single:一个用来发送和接收消息的单独的线程上下文
MessageProducer :一个由Session对象创建的,用来发送消息的到目的地的对象。
MessageConsumer :一个由Session对象创建的,用来接收发送到某个目的地的消息的对象。
开发一个基于 JMS的消息客户端应用的编程步骤
1、使用JNDI查找一个ConnectionFactory对象。
2、使用JNDI查找一个或者多个Destination对象。
3、使用ConnectionFactory创建一个JMS连接
4、使用连接创建一个或者多个JMS Sessions
5、使用Session and Destinations 创建所需的MessageProducers 和MessageConsumers
6、告知Connection 开始传送消息。
企业级的消息产品将消息看做包括一个“头”(header)和一个“体”(body)的“轻量级”条目。 “消息头”包含一些用于消息路由和消息识别的字段。 “消息体”中包含了被发送的应用数据。
JMS消息模型目标如下:
提供一个单独,统一的消息API。
提供一个API用于创建消息能够匹配已有的,非JMS应用所使用的格式。
支持跨操作系统、机器结构以及计算机语言的异构应用的开发。
支持包含Java对象的消息。
支持包含可扩展标记语言(XML)页面的消息。
JMS消息包含以下组成部分:
消息头(Header) :所有的消息都支持一套相同的头字段。头字段包含了客户端和提供者(provider)用来路由和识别消息的数据。
消息属性(Properties ):在标准头字段之外提供一种内建的设施用于给消息添加可选的头字段
应用指定的属性:提供一种给消息添加应用指定的头字段的机制。
标准属性 :JMS定义的一些标准属性,即一些有效的、可选的头字段。
Provider指定的属性:在集成JMS客户端和provider 内在客户端时可能需要使用
Provider指定的属性,JMS 为这些定义了命名约定。
消息体(Body):JMS定义了几种类型的消息体,这些消息体覆盖目前常用的几种消息样式。
对消息头信息如何被设置的总结
Header Fields Set By
JMSDestination Send Method
JMSDeliveryMode Send Method
JMSExpiration Send Method
JMSPriority Send Method
JMSMessageID Send Method
JMSTimestamp Send Method
JMSCorrelationID Client
JMSReplyTo Client
JMSType Client
JMSRedelivered Provider
JMSDestination 消息发送的目的地
JMSDeliveryMode 传递模式, 有两种模式: PERSISTENT 和NON_PERSISTENT,PERSISTENT 表示该消息一定要被送到目的地,否则会导致应用错误。NON_PERSISTENT 表示偶然丢失该消息是被允许的,这两种模式使开发者可以在消息传递的可靠性和吞吐量之间找到平衡点。
JMSMessageID 唯一识别每个消息的标识,由JMS Provider 产生。
JMSTimestamp 一个消息被提交给JMS Provider 到消息被发出的时间。
JMSCorrelationID 用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。
JMSReplyTo 提供本消息回复消息的目的地址
JMSRedelivered 如果一个客户端收到一个设置了JMSRedelivered 属性的消息,则表示可能该客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged)。
JMSType 消息类型的识别符。
JMSExpiration 消息过期时间,等于QueueSender 的send 方法中的timeToLive 值或TopicPublisher 的publish 方法中的timeToLive 值加上发送时刻的GMT 时间值。如果timeToLive值等于零,则JMSExpiration 被设为零,表示该消息永不过期。如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。
JMSPriority 消息优先级,从0-9 十个级别,0-4 是普通消息,5-9 是加急消息。JMS 不要求JMS Provider 严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。
JMS 定义的属性
JMSXUserID String Send 用于标识发送消息的用户。
JMSXAppID String Send 用于识别发送消息的应用。
JMSXDeliveryCount int Receive 这消息发送尝试的次数。第一次是1,然后是2…..
JMSXGroupID String Client 用来表示消息是哪个组的一部分。
JMSXGroupSeq int Client 表示消息在组内的顺序号第一个消息是1,第二个是2,……
JMSXProducerTXID String Send 事务标识符,用来表示消息是在哪个事务中产生的。
JMSXConsumerTXID String Receive 消息标识符,用来说明消息是在哪个事务中被消费的。
MSXRcvTimestamp long Receive 消息被发送到消费者时的时间。
JMSXState int 设想有一个消息仓库保存每个被发给消费者消息的拷贝,并且这些拷贝从消息开始发出之时就存在。每个拷贝的状态是如下:
1(waiting), 2(ready), 3(expired) or 4(retained).
因为产生者和消费者都不关心状态,所以这个属性只是用于在仓库中查询消息,并且JMS没有为其提供任何的API。
JMS消息体
JMS提供五种格式的消息体。每种格式都通过一个消息接口定义。
? StreamMessage – 消息体包含了一个Java primitive 流,这个流被顺序地填充和读取。
? MapMessage – 消息体包含了一系列的名字-值对。名字是Strings,而值则是Java primitive类型。消息体中的条目可以被enumerator按照顺序访问,也可以自由访问。条目的顺序没有定义。
? TextMessage – 消息体包含了一个java.lang.String. 包含这种这种消息类型是考虑到String消息将被广泛使用的前提。另外一个原因就是XML将可能变成一种用来表示JMS消息内容的主流机制。
? ObjectMessage –消息包含了一个可序列化的Java对象.如果需要Java对象集合(collection),可以是JDK 1.2提供的集合类型中的任何一种。
? BytesMessage – 消息包含了一个不间断的字节流。这个消息类型是用来以文字方式编码一个消息体以匹配存在的消息格式。在很多种情况下,它可能被用于以下用途:自定义的消息类型,尽管JMS允许使用带有字节的消息属性,但它们通常不能被使用,因为包含的属性可以影响格式。
“事务性会话”指的是这种情况,即,一个会话的提交和回滚方法被用来界定一个事务是否位于这个会话。在会话的工作由一个外部事务管理器来协调处理的时候。不需要调用会话的提交和回滚方法,并且,关闭会话工作的结果最终由事务管理器决定
没有限制能够使用一个会话对象的线程数量,也没有限制线程能够创建会话的数量。限制就是会话的资源不能够被多个线程并发使用。它要求用户来保证这种并发限制被满足。最简单的方法就是使用一个线程。在异步传送的情况下,使用一个线程用来在停止模式下建立会话,然后启动异步传送。在更复杂的情况下,用户必须提供显式的同步
JMS支持两种消息传送模式:
1、NON_PERSISTENT 模式是开销最低的传输模式,因为它不需要消息被记录到稳定的存储中。JMS提供者失败会导致NON_PERSISTENT 被丢失。
2、PERSISTENT 模式指令JMS提供者特别关注“不能由于JMS 提供者的失败而导致的消息的丢失”。JMS提供者最多只能将NON_PERSISTENT消息发送一次。这意味着,它可能会丢失消息,但决不会发送两次。JMS提供者必须保证PERSISTENT发送一次且只有一次。这意味着,JMS提供者的失败不会导致消息丢失,而且它不会被发送两次。
点对点系统是用队列来处理消息,它之所以是“点对点”是因为客户端向特定的队列发送消息。
JMS Pub/Sub模式定义JMS客户端如何发布消息,并且从一个众所周知的基于内容结构的节点来定义消息。JMS将这些节点称之为主题(topics)。