您的位置:首页 > Web前端

JMS简介及Ipedo Feeds(1)

2004-07-05 16:07 387 查看
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信息都有set和get接口。参见下面的代码
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)等。另一些JMSReplyTo,JMSType等header信息则是由开发人员设定。

B. Properties: Properties的作用类似于一些额外的header信息。Property的值可以是boolean, byte, short, int, long, float, double, 或String。JMS接口也定义了这些类型的property的get和set方法。Properties又分为三类:1. 应用相关的Property, 比如下面代码段中的username这个property,
TextMessage message = pubSession.createTextMessage( );message.setText(text);message.setStringProperty("username",username);publisher.publish(message);username在其他的应用中是没有意义的。2. JMS定义的property,这些property和1中所讲的property具有相同的特性,只不过它们是由JMS provider设定,其实就是可选的header。Provider可以任意选择下列的property进行支持,或者一个也不支持。
· JMSXUserID
· JMSXAppID
· JMSXProducerTXID
· JMSXConsumerTXID
· JMSXRcvTimestamp
· JMSXDeliveryCount
· JMSXState
· JMSXGroupID
· JMSXGroupSeq
3.Provider相关的property,每一个JMS provider还可以定义一系列的私有的property,由客户端或provider自己设定,每一个JMS provider相关的property都以JMS_开头,后面跟property的名字。
同时,provider可以根据消息的header和property来定义消息的选择器(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 这个interface。TextMessage使用字符串作为消息的payload;ObjectMessage使用可序列化的对象作为消息的payload;BytesMessage使用byte数组作为消息的payload;StreamMessage使用原始数据类型的流作为消息的payload;MapMessage使用name-value对作为消息的payload下面的代码说明了如何设置text message并发送这个message,其他类型的消息类似:TextMessage textMessage = session.createTextMessage( );
textMessage.setText("Hello!");
topicPublisher.publish(textMessage);
...
TextMessage textMessage = session.createTextMessage("Hello!");
queueSender.send(textMessage);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: