Java中间件JMS(五)之JMS入门
高级接口PTP 域Pub/sub 域ConnectionFactory
QueueConnectionFactory
TopicConnectionFactory
Connection
QueueConnection
TopicConnection
Destination
Queue
Topic
Session
QueueSession
TopicSession
MessageProducer
QueueSender
TopicPublisher
MessageConsumer
QueueReceiver
,QueueBrowser
TopicSubscriber
?
在 JMS 以前的版本中,高级接口是特定于域的接口的父接口,并且只包含在两个域中共有的那些功能。JMS 提供者没有提供高级接口的实现。在 JMS 1.1 中,一些高级接口现在则被认为是“公用接口”,并且它们包含两个域的所有功能; JMS 提供者必须提供这些接口的实现。尽管公用接口仍然是特定于域的接口的父接口,但它们现在是 JMS 客户机编程的首选方法,并且它们提供特定于域的接口只为了后向兼容。
下面重新列出了前一小节中的表,展示了一些公用接口。
?
JMS 公用接口PTP 域Pub/sub 域ConnectionFactory
QueueConnectionFactory
TopicConnectionFactory
Connection
QueueConnection
TopicConnection
Destination
Queue
Topic
Session
QueueSession
TopicSession
MessageProducer
QueueSender
TopicPublisher
MessageConsumer
QueueReceiver
,QueueBrowser
TopicSubscriber
?
统一有公用接口的域会导致继承这些方法的一些特定于域的类不再适合它的域。如果在客户机代码中出现这种情况,JMS 提供者需要使用 IllegalStateException。
?
8、jms开发
?
一个典型的 JMS 程序要经过以下步骤才能开始产生和使用消息:
- 通过 JNDI 查询?
ConnectionFactory
?。 - 通过 JNDI 查询一个或者多个?
Destination
。 - 用?
ConnectionFactory
?创建一个?Connection
。 - 用?
Connection
?创建一个或者多个?Session
。 - 用?
Session
?和?Destination
?创建所需要的?MessageProducer
?和?MessageConsumer
。 - 启动?
Connection
。
这时,消息就可以开始流动,应用程序可以根据需要接收、处理和发送消息。 在后面几节中,我们将开发 JMS 程序,您将会看到这些步骤的细节。
?
9、jms消息
?
消息系统的核心当然是消息。JMS 为不同类型的内容提供了几种消息类型,但所有消息都是从?Message
?接口派生出来的。
Message
?分为三个组成部分:
- header?是一组标准字段,客户机和提供者都用它们来标识和路由消息。
- Properties?提供了一个给消息添加可选标题字段的实用工具。如果应用程序需要用标准标题字段没有提供的方法对消息进行归类或分类,那么可以为消息添加一个属性来实现这种归类和分类;提供了?
set<Type>Property(...)
?和?get<Type>Property(...)
?方法来设置和获得各种 Java 类型的属性,其中包括?Object
。JMS 定义了提供者可以选择性提供的一组标准属性。 - 消息的?body?包含将 发送到接收应用程序的内容。每一个消息接口都专用于它所支持的内容类型。?
10、header属性
?
下面列出了?
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 程序,程序不知道消息的接收者是谁;由提供者在接收过程中设置。
?
?
11、标准属性
?
下面列表给出了?
Message
?的每一个标准属性的名称、它对应的 Java 类型和该属性的说明。提供者对标准属性的支持是可选的。JMS 为这些属性和将来 JMS 定义的属性保留了 “JMSX” 属性名。JMSXUserID
——类型为?string
发送消息的用户的身份。
JMSXApplID
——类型为?string
发送消息的应用程序的身份。
JMSXDeliveryCount
——类型为?int
已经尝试发送消息的次数。
JMSXGroupID
——类型为?string
该消息所属的消息组的身份。
JMSXGroupSeq
——类型为?int
该消息在消息组中的序号。
JMSXProducerTXID
——类型为?string
生成该消息的事务的身份。
JMSXConsumerTXID
——类型为?string
使用该消息的事务的身份。
JMSXRcvTimestamp
——类型为?long
JMS 将消息发送给客户的时间。
JMSXState
——类型为?int
提供者用它来维护消息的消息仓库,通常,它与 JMS 生产者和客户关系不大。
JMSX_<vendor_name>
为特定于提供者的属性而保留。