落羽成舟 2015-02-05
JMS接口描述
JMS支持两种消息类型PTP和Pub/Sub,分别称作:PTPDomain和Pub/SubDomain,这两种接口都继承统一的JMSParent接口,JMS主要接口如下所示:
JMSParentPTPDomainPub/SubDomain
ConnectionFactoryQueueConnectionFactoryTopicConnectionFactory
ConnectionQueueConnectionTopicConnection
DestinationQueueTopic
SessionQueueSessionTopicSession
MessageProducerQueueSenderTopicPublisher
MessageConsumerQueueReceiver,QueueBrowserTopicSubscriber
以下是对这些接口的简单描述:
ConnectionFactory:连接工厂,JMS用它创建连接
Connection:JMS客户端到JMSProvider的连接
Destination:消息的目的地
Session:一个发送或接收消息的线程
MessageProducer:由Session对象创建的用来发送消息的对象
MessageConsumer:由Session对象创建的用来接收消息的对象
JMS消息模型
JMS消息由以下几部分组成:消息头,属性,消息体。
消息头(Header)-消息头包含消息的识别信息和路由信息,消息头包含一些标准的属性如:JMSDestination,JMSMessageID等。
消息头由谁设置
JMSDestinationsend或publish方法
JMSDeliveryModesend或publish方法
JMSExpirationsend或publish方法
JMSPrioritysend或publish方法
JMSMessageIDsend或publish方法
JMSTimestampsend或publish方法
JMSCorrelationID客户
JMSReplyTo客户
JMSType客户
JMSRedeliveredJMSProvider
属性(Properties)-除了消息头中定义好的标准属性外,JMS提供一种机制增加新属性到消息头中,这种新属性包含以下几种:
1.应用需要用到的属性;
2.消息头中原有的一些可选属性;
3.JMSProvider需要用到的属性。
标准的JMS消息头包含以下属性:
JMSDestination--消息发送的目的地
JMSDeliveryMode--传递模式,有两种模式:PERSISTENT和NON_PERSISTENT,PERSISTENT表示该消息一定要被送到目的地,否则会导致应用错误。NON_PERSISTENT表示偶然丢失该消息是被允许的,这两种模式使开发者可以在消息传递的可靠性和吞吐量之间找到平衡点。
JMSMessageID唯一识别每个消息的标识,由JMSProvider产生。
JMSTimestamp一个消息被提交给JMSProvider到消息被发出的时间。
JMSCorrelationID用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。
JMSReplyTo提供本消息回复消息的目的地址。
JMSRedelivered如果一个客户端收到一个设置了JMSRedelivered属性的消息,则表示可能该客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged)。
JMSType消息类型的识别符。
JMSExpiration消息过期时间,等于QueueSender的send方法中的timeToLive值或TopicPublisher的publish方法中的timeToLive值加上发送时刻的GMT时间值。如果timeToLive值等于零,则JMSExpiration被设为零,表示该消息永不过期。如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。
JMSPriority消息优先级,从0-9十个级别,0-4是普通消息,5-9是加急消息。JMS不要求JMSProvider严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。
消息体(Body)-JMSAPI定义了5种消息体格式,也叫消息类型,你可以使用不同形式发送接收数据并可以兼容现有的消息格式,下面描述这5种类型:
消息类型消息体
TextMessagejava.lang.String对象,如xml文件内容
MapMessage名/值对的集合,名是String对象,值类型可以是Java任何基本类型
BytesMessage字节流
StreamMessageJava中的输入输出流
ObjectMessageJava中的可序列化对象
Message没有消息体,只有消息头和属性。