CSDN博客

img superlmj

JMS简介及Ipedo Feeds(1)

发表于2004/7/5 16:07:00  1010人阅读

1. 前言

当今社会,信息无处不在。他们的载体又大多是不同的系统。那如何在这些系统间进行信息交互呢?答案就是MOM(Message-Oriented Middleware)MOM允许两个或更多个企业级应用间以消息的形式来交互信息。而不同的MOM厂商提供了不同的API给开发人员来接受和发送消息、定义了不同的网络协议、管理工具等。为了统一这些关于消息的相关内容,SUN提出了JMS(Java Message Service)规范。JMS类似于JDBC,能够让应用程序开发人员重用相同的API来访问不同的系统。而实现了JMS规范(http://java.sun.com/products/jms/docs.html)的实体称为JMS provider,也就是消息交互之间的桥梁。在JMS规范中JMS client分为消息发送者(生产者)和消息接受者(消费者)

 

Fig1. JMS系统图

2. JMS消息组成

 

Fig2. JMS消息组成

从上图可以看出JMS定义了以下三种组成部分。

A.     Header: 包括用于描述谁创建了这个消息、何时创建、多长时间内该消息有效以及消息的destination(Topic queue)metadata信息。每一个header信息都有setget接口。参见下面的代码

   public interface Message {
      public Destination getJMSDestination( ) throws JMSException;
      public void setJMSDestination(Destination destination)throws JMSException;
      public int getJMSDeliveryMode( ) throws JMSException;
      public void setJMSDeliveryMode(int deliveryMode)throws JMSException;
      public String getJMSMessageID( ) throws JMSException;
      public void setJMSMessageID(String id) throws JMSException;
      public long getJMSTimestamp( ) throws JMSException;
      public void setJMSTimestamp(long timestamp) throws JMSException;

     .........

}

而其中有些header信息是由JMS provider自动设定的,也就是说开发人员调用set方法设定的值将会被JMS provider覆盖。比如JMSDestination(Topic or queue)JMSDeliveryMode(persistent or nonpersistent)等。另一些JMSReplyToJMSTypeheader信息则是由开发人员设定。

 

B. Properties: Properties的作用类似于一些额外的header信息。Property的值可以是boolean, byte, short, int, long, float, double, StringJMS接口也定义了这些类型的propertygetset方法。Properties又分为三类:

1.  应用相关的Property, 比如下面代码段中的username这个property,

TextMessage message = pubSession.createTextMessage( );

message.setText(text);

message.setStringProperty("username",username);

publisher.publish(message);

username在其他的应用中是没有意义的。

2.  JMS定义的property,这些property1中所讲的property具有相同的特性,只不过它们是由JMS provider设定,其实就是可选的headerProvider可以任意选择下列的property进行支持,或者一个也不支持。

     ·  JMSXUserID

·  JMSXAppID

·  JMSXProducerTXID

·  JMSXConsumerTXID

·  JMSXRcvTimestamp

·  JMSXDeliveryCount

·  JMSXState

·  JMSXGroupID

·  JMSXGroupSeq

3Provider相关的property,每一个JMS provider还可以定义一系列的私有的property,由客户端或provider自己设定,每一个JMS provider相关的property都以JMS_开头,后面跟property的名字。

同时,provider可以根据消息的headerproperty来定义消息的选择器(Message Selectors),达到消息过滤的功能。比如下面的选择器(黑体部分)用来告诉消息服务器只发送不包含username这个property等于William的消息给消息消费者:

TopicSubscriber subscriber =

session.createSubscriber(chatTopic, " username != 'William' ",false);

消息选择器基于SQL中的where子句。

 

C Payload: 就是消息包含的真正的数据。JMS定义了五种消息类型接口TextMessage,

StreamMessage, MapMessage, ObjectMessage, and BytesMessage,它们都继承于Message 这个interfaceTextMessage使用字符串作为消息的payloadObjectMessage使用可序列化的对象作为消息的payloadBytesMessage使用byte数组作为消息的payloadStreamMessage使用原始数据类型的流作为消息的payloadMapMessage使用name-value对作为消息的payload下面的代码说明了如何设置text message并发送这个message,其他类型的消息类似:

TextMessage textMessage = session.createTextMessage( );

textMessage.setText("Hello!");

topicPublisher.publish(textMessage);

...

TextMessage textMessage = session.createTextMessage("Hello!");

queueSender.send(textMessage);

 

0 0

相关博文

我的热门文章

img
取 消
img