JMS : Java Message Service (Java消息服务)之一 [转]

1 引言
1.1 编写目的
本文做为B2bi项目中开源产品JORAM的使用指导文档,旨在帮助项目组人员方便明了的进行JMS模块的详细设计和开发工做。本文档主要包含建设银行EAI平台B2Bi子系统中使用的开源JMS产品??JORAM的使用说明html

1.2 名词解释
B2Bi:
Business to Business integration (企业间集成)
JMS:
Java Message Service (Java消息服务)
JORAM:
ObjectWeb的Java开源项目
JNDI:
Java命名和目录接口
1.3 参考资料
《Joram-4.3-en.pdf》??JORAM使用手册(英文)
《Joram4_0_SAMPLES.pdf》??JORAM使用举例(英文)
《Joram4_0_ADMIN.pdf》??JORAM管理员手册(英文)
2 JMS简介
2.1 JMS基本概念
JMS(Java Message Service)是访问企业消息系统的标准API,它便于消息系统中的Java应用程序进行消息交换,而且经过提供标准的产生、发送、接收消息的接口简化企业应用的开发。
JMS应用由如下几部分组成:
JMS provider :是一个消息系统,它实现了JMS 接口并提供管理和控制的功能。
JMS clients :是用Java语言写的一些程序和组件,它们产生和使用消息。
Messages :是在JMS clients之间传递的消息的对象。
Administered objects :是由使用JMS clients 的人生成的预选设置好的JMS 对象。有两种这样的对象:destinations和connection factories。
2.2 JMS基本功能
JMS是用于和面向消息的中间件相互通讯的应用程序接口。它既支持点对点(point-to-point)的域,又支持发布/订阅(publish/subscribe)类型的域,而且提供对下列类型的支持:经承认的消息传递,事务型消息的传递,一致性消息和具备持久性的订阅者支持。JMS还提供了另外一种方式来对您的应用与旧的后台系统相集成。
2.3 消息服务类型
1) point-to-point (PTP)方式:点到点的模型。消息由一个JMS客户机(发布者)发送到服务器上的一个目的地,即一个队列(queue)。而另外一个JMS客户机(订阅者)则能够访问这个队列,并从该服务器获取这条消息。
point-to-point (PTP)方式有如下特色:
a) 每个message只有一个使用者。
b) 一个message的sender和receiver没有时间上的依赖关系。不管sendere有没有在运行,Receiver均可提取message。
c) Receiver完成对message处理这后,发出确认。
d) 当你所发出的每个消息必须由一个使用者成功处理的状况下,使用 PTP messaging机制。
2) publish/subscribe (pub/sub)方式:发布-订阅模型。这里仍然是由一个JMS客户机将一条消息发布到服务器上的一个目的地上,可是此次这个目的地叫作一个主题(topic),可有多个订阅者去访问该消息。消息将一直维持在主题中,直到这个主题的全部订阅者都取走了该消息的一个副本。消息也包括了一个参数,用于定义了该消息的耐久性(它可以在服务器上等待订阅者多长时间)。
Pub/sub messaging有以下的特色:
a) 每个message能够有多个使用者;
b) Publishers和subscribers在时间上有依赖关系。一个订阅了某一个topic的客户,只能使用在它生成订阅以后发布的message, 而且subscriber必须一直保持活动状态。
c) JMS API容许客户生成持久性的订阅,从而在某种程度上放宽了这种时间上的依赖关系,提升了灵活性处可靠性。
3) Messaging的使用
Messaging自己是异步的,使message的使用者之间没有时间上的依赖关系。可是,JMS规范给出了更精确的定义,使Message能够以两种方式被使用:
a) Synchronously同步:subscriber或receiver能够经过调用receive方法实时地从destination上提取message。Receive方法在收到一个 message后结束,或当message 在必定的时间限制内没有收到时超时结束。
b) Asynchronously异步:客户能够为某一个使用者注册一个message listener。message listener和event listener很类似。当一个message到达了destination, JMS provider经过调用listener的onMessage方法将message传递过去,由onMessage方法负责处理message。
更详细的JMS规范可参考SUN相关文档。
2.4 JMS接口类图java

2.5 JMS基本视图
1.JMS接口描述
JMS 支持两种消息类型PTP 和Pub/Sub,分别称做:PTP Domain 和Pub/Sub Domain,这两种接口都继承统一的JMS父接口,JMS 主要接口以下所示:
MS父接口 PTP Pub/Sub
ConnectionFactory QueueConnectionFactory TopicConnectionFactory
Connection QueueConnection TopicConnection
Destination Queue Topic
Session QueueSession TopicSession
MessageProducer QueueSender TopicPublisher
MessageConsumer QueueReceiver,QueueBrowse r TopicSubscriberweb



ConnectionFactory :链接工厂,JMS 用它建立链接
Connection :JMS 客户端到JMS Provider 的链接
Destination :消息的目的地
Session: 一个发送或接收消息的线程
MessageProducer: 由Session 对象建立的用来发送消息的对象
MessageConsumer: 由Session 对象建立的用来接收消息的对象express

2.JMS消息模型
JMS 消息由如下几部分组成:消息头,属性,消息体。编程

2.1 消息头(Header) - 消息头包含消息的识别信息和路由信息,消息头包含一些标准的属性如:JMSDestination,JMSMessageID 等。
消息头 由谁设置
JMSDestination send 或 publish 方法
JMSDeliveryMode send 或 publish 方法
JMSExpiration send 或 publish 方法
JMSPriority send 或 publish 方法
JMSMessageID send 或 publish 方法
JMSTimestamp send 或 publish 方法
JMSCorrelationID 客户
JMSReplyTo 客户
JMSType 客户
JMSRedelivered JMS Providerwindows


2.2 属性(Properties) - 除了消息头中定义好的标准属性外,JMS 提供一种机制增长新属性到消息头中,这种新属性包含如下几种:
1. 应用须要用到的属性;
2. 消息头中原有的一些可选属性;
3. JMS Provider 须要用到的属性。
标准的JMS 消息头包含如下属性:
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 严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。服务器

2.3 消息体(Body) - JMS API 定义了5种消息体格式,也叫消息类型,你可使用不一样形式发送接收数据并能够兼容现有的消息格式,下面描述这5种类型:
消息类型 消息体
TextMessage java.lang.String对象,如xml文件内容
MapMessage 名/值对的集合,名是String对象,值类型能够是Java任何基本类型
BytesMessage 字节流
StreamMessage Java中的输入输出流
ObjectMessage Java中的可序列化对象
Message 没有消息体,只有消息头和属性网络


下例演示建立并发送一个TextMessage到一个队列:
TextMessage message = queueSession.createTextMessage();
message.setText(msg_text); // msg_text is a String
queueSender.send(message);session

下例演示接收消息并转换为合适的消息类型:
Message m = queueReceiver.receive();
if (m instanceof TextMessage) {
TextMessage message = (TextMessage) m;
System.out.println("Reading message: " + message.getText());
} else {
// Handle error
}架构

3. 消息的同步异步接收
消息的同步接收是指客户端主动去接收消息,JMS 客户端能够采用MessageConsumer 的receive方法去接收下一个消息。
消息的异步接收是指当消息到达时,主动通知客户端。JMS 客户端能够经过注册一个实 现MessageListener 接口的对象到MessageConsumer,这样,每当消息到达时,JMS Provider 会调用MessageListener中的onMessage 方法。

4. PTP模型
PTP(Point-to-Point)模型是基于队列的,发送方发消息到队列,接收方从队列接收消息,队列的存在使得消息的异步传输成为可能。和邮件系统中的邮箱同样,队列能够包含各类消息,JMS Provider 提 供工具管理队列的建立、删除。JMS PTP 模型定义了客户端如何向队列发送消息,从队列接收消息,浏览队列中的消息。
下面描述JMS PTP 模型中的主要概念和对象:
名称 描述
Queue 由JMS Provider 管理,队列由队列名识别,客户端能够经过JNDI 接口用队列名获得一个队列对象。
TemporaryQueue 由QueueConnection 建立,并且只能由建立它的QueueConnection 使用。
QueueConnectionFactory 客户端用QueueConnectionFactory 建立QueueConnection 对象。
QueueConnection 一个到JMS PTP provider 的链接,客户端能够用QueueConnection 建立QueueSession 来发送和接收消息。
QueueSession 提供一些方法建立QueueReceiver 、QueueSender、QueueBrowser 和TemporaryQueue。若是在QueueSession 关闭时,有一些消息已经被收到,但尚未被签收(acknowledged),那么,当接收者下次链接到相同的队列时,这些消息还会被再次接收。
QueueReceiver 客户端用QueueReceiver 接收队列中的消息,若是用户在QueueReceiver 中设定了消息选择条件,那么不符合条件的消息会留在队列中,不会被接收到。
QueueSender 客户端用QueueSender 发送消息到队列。
QueueBrowser 客户端能够QueueBrowser 浏览队列中的消息,但不会收走消息。
QueueRequestor JMS 提供QueueRequestor 类简化消息的收发过程。QueueRequestor 的构造函数有两个参数:QueueSession 和queue,QueueRequestor 经过建立一个临时队列来完成最终的收发消息请求。
可靠性(Reliability) 队列能够长久地保存消息直到接收者收到消息。接收者不须要由于担忧消息会丢失而时刻和队列保持激活的链接状态,充分体现了异步传输模式的优点。

5. PUB/SUB模型
JMS Pub/Sub 模型定义了如何向一个内容节点发布和订阅消息,这些节点被称做主题(topic)。
主题能够被认为是消息的传输中介,发布者(publisher)发布消息到主题,订阅者(subscribe)从主题订阅消息。主题使得消息订阅者和消息发布者保持互相独立,不须要接触便可保证消息的传送。
下面描述JMS Pub/Sub 模型中的主要概念和对象:
名称 描述
订阅(subscription) 消息订阅分为非持久订阅(non-durable subscription)和持久订阅(durable subscrip-tion),非持久订阅只有当客户端处于激活状态,也就是和JMS Provider 保持链接状态才能收到发送到某个主题的消息,而当客户端处于离线状态,这个时间段发到主题的消息将会丢失,永远不会收到。持久订阅时,客户端向JMS 注册一个识别本身身份的ID,当这个客户端处于离线时,JMS Provider 会为这个ID 保存全部发送到主题的消息,当客户再次链接到JMS Provider时,会根据本身的ID 获得全部当本身处于离线时发送到主题的消息。
Topic 主题由JMS Provider 管理,主题由主题名识别,客户端能够经过JNDI 接口用主题名获得一个主题对象。JMS 没有给出主题的组织和层次结构的定义,由JMS Provider 本身定义。
TemporaryTopic 临时主题由TopicConnection 建立,并且只能由建立它的TopicConnection 使用。临时主题不能提供持久订阅功能。
TopicConnectionFactory 客户端用TopicConnectionFactory 建立TopicConnection 对象。
TopicConnection TopicConnection 是一个到JMS Pub/Sub provider 的链接,客户端能够用TopicConnection建立TopicSession 来发布和订阅消息。
TopicSession TopicSession 提供一些方法建立TopicPublisher、TopicSubscriber、TemporaryTopic 。它还提供unsubscribe 方法取消消息的持久订阅。
TopicPublisher 客户端用TopicPublisher 发布消息到主题。
TopicSubscriber 客户端用TopicSubscriber 接收发布到主题上的消息。能够在TopicSubscriber 中设置消息过滤功能,这样,不符合要求的消息不会被接收。
Durable TopicSubscriber 若是一个客户端须要持久订阅消息,可使用Durable TopicSubscriber,TopSession 提供一个方法createDurableSubscriber建立Durable TopicSubscriber 对象。
恢复和从新派送(Recovery and Redelivery) 非持久订阅状态下,不能恢复或从新派送一个未签收的消息。只有持久订阅才能恢复或从新派送一个未签收的消息。
TopicRequestor JMS 提供TopicRequestor 类简化消息的收发过程。TopicRequestor 的构造函数有两个参数:TopicSession 和topic。TopicRequestor 经过建立一个临时主题来完成最终的发布和接收消息请求。
可靠性(Reliability) 当全部的消息必须被接收,则用持久订阅模式。当丢失消息可以被容忍,则用非持久订阅模式。

3 JMS API编程模型
一个JMS应用由如下几个模块组成:
3.1 Administered Objects
JMS应用的destinations和connection factories最后是经过管理而不是编程来使用,由于不一样的provider使用他们的方法不同。
JMS 客户应该使用统一的接口获得这些objects,从而使用JMS应用能够运行在不一样provider上,而不须要修改或修改不多。一般管理员在JNDI上设置administered objects, 而后JMS clients 在JNDI上look up这些对象。
a) Connection Factories:
connection factory 是client用来生成与provider的connection的对象。connection factory封装了一套由管理员定义的connection configuration参数。每一个connection factory 是一个QueueConnectionFactory 或 TopicConnectionFactory接口的实例。
在JMS 客户程序中, 一般先执行connection factory 的JNDI API lookup。 以下例:
Context ctx = new InitialContext();
QueueConnectionFactory queueConnectionFactory =
(QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");
TopicConnectionFactory topicConnectionFactory =
(TopicConnectionFactory) ctx.lookup("TopicConnectionFactory");
若是调用不带参数的InitialContext的lookup方法,就在当前classpath 找jndi.properties文件。
b) Destinations:
Destination 是一个对象用于定义用户产生的messages 的去向或用户使用的messages 的来源。
在PTP里,destinations被称做queues, 能够用下面的命令来生成它们:
Queue queue = (Queue) Queue.create("queue");
在pub/sub里, destinations被称为topics, 能够用下面的J2EE SDK command 来生成它们:
Topic topic = (Topic) Topic.create("topic");
一个JMS应用能够同时使用多个queues 和/或topics。
除了lookup connection factory, 也常要lookup destination。例如:
Topic myTopic = (Topic) ctx.lookup("MyTopic");
Queue myQueue = (Queue) ctx.lookup("MyQueue");
3.2 Connection
Connection封装了一个与JMS provider的虚拟链接。Connection表示在client和provider service daemon之间打开的TCP/IP socket。能够用connection 生成一个或多个sessions。
就象connection factories, connections有两种方式:实现QueueConnection或TopicConnection接口。例如, 当有一个QueueConnectionFactory 或TopicConnectionFactory对象, 能够用他们来创造一个connection:
QueueConnection queueConnection =
queueConnectionFactory.createQueueConnection();
TopicConnection topicConnection =
topicConnectionFactory.createTopicConnection();
注意:当应用程序完成后, 必须关闭你所建立的connections。不然JMS provider 没法释放资源。关闭了connection同时也关闭了sessions和message产生者和message使用者。
queueConnection.close();
topicConnection.close();
在使用messages前, 必须调用connection的start方法。若是要暂时中止传送message而不关闭connection, 能够调用stop方法。
connection factory 是client用来生成与provider的connection的对象。connection factory封装了一套由管理员定义的connection configuration参数。每一个connection factory 是一个QueueConnectionFactory 或 TopicConnectionFactory接口的实例。
3.3 Session
Session是单线程的context用于产生和使用messages。用Session建立 message producers、message consumers和messages。Session管理message listeners的执行顺序。
Ssession提供事务模式,用于将一系列的sends和receives动做组合在一个工做单元里。
Session被标记为事务模式的话,确认消息就经过确认和校订来自动地处理。若是session没有标记为事务模式,有三个用于消息确认的选项:
? AUTO_ACKNOWLEDGE session将自动地确认收到一则消息。
? CLIENT_ACKNOWLEDGE 客户端程序将确认收到一则消息,调用这则消息的确认方法。
? DUPS_OK_ACKNOWLEDGE 这个选项命令session“懒散的”确认消息传递,能够想到,这将致使消息提供者传递的一些复制消息可能会出错。这种确认的方式只应当用于消息消费程序能够容忍潜在的副本消息存在的状况。
Sessions, 就象connections, 也有两种方式:实现QueueSession或TopicSession接口。例如:
TopicSession topicSession =
topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
第一个参数表示sessiong不实现事务处理; 第二个参数表示当session成功收到messages后自动确认。
相同的,能够用QueueConnection对象建立QueueSession:
QueueSession queueSession =
queueConnection.createQueueSession(true, 0);
这里, 第一个参数表示session实现事务处理; 第二个参数表示当session成功收到messages后不自动确认。
3.4 Message Producers?消息生产者
message producer是由session建立的一个对象,用于将messages传递到目的地。PTP方式的message producer实现QueueSender接口。 pub/sub方式的message producer实现TopicPublisher接口。
例如::
QueueSender queueSender = queueSession.createSender(myQueue);
TopicPublisher topicPublisher = topicSession.createPublisher(myTopic);
用null做为createSender或createPublisher的参数,能够建立一个不肯定的producer。用不肯定的producer, 能够等到真正send或publish message的时候才指定destination
当建立了一个message producer, 就能够用它来发送messages。例如:
queueSender.send(message);
topicPublisher.publish(message);
3.5 Message Consumer?消息消费者
message consumer也是由session建立的一个对象,用于接收发送到目的地的消息。message consumer容许JMS client到JMS provider注册感兴趣的目的地。JMS provider管理messages从destination到注册了这个destination的consumers之间的传送。
PTP方式的message consumer实现QueueReceiver接口。pub/sub方式的message consumer实现TopicSubscriber接口。
例如:
QueueReceiver queueReceiver = queueSession.createReceiver(myQueue);
TopicSubscriber topicSubscriber = topicSession.createSubscriber(myTopic);
能够用TopicSession.createDurableSubscriber方法建立一个durable topic subscriber(异步消息订阅 )。
当建立了一个message consumer, 它就是活动的,就能够用它接收messages。能够用QueueReceiver 或TopicSubscriber的close方法把message consumer变成非活动的。Message的传送在调用了connection的start方法后才开始。
不管是QueueReceiver或TopicSubscriber, 均可以用receive方法来同步consume message。能够在调用start方法后的任什么时候间调用它:
queueConnection.start();
Message m = queueReceiver.receive();
topicConnection.start();
Message m = topicSubscriber.receive(1000); // time out after a second
异步consume message, 可使用message listener。
a) Message Listeners
message listener是一个对象,用做充当messages的异步事件处理器。它实现了MessageListener接口, 它只有一个方法:onMessage。 在onMessage方法内, 能够定义当收到一个message后作的事情。
用setMessageListener方法在某个QueueReceiver 或TopicSubscriber里注册message listener。例如:
TopicListener topicListener = new TopicListener();
topicSubscriber.setMessageListener(topicListener);
当注册了message listener, 调用QueueConnection或TopicConnection的方法来开始传送message。
当message开始传送, 当有message送来,message consumer自动调用message listener的 onMessage方法。onMessage方法只有一个Message类型的参数。
message listener并不对应特定的destination类型. 相同的listener能够从queue或topic上获得message, 这取决于listener是由QueueReceiver仍是 TopicSubscriber对象设置的。然而message listener一般对应某一个message类型或格式, 若是要回应messages, message listener必须建立一个message producer。
onMessage方法应该处理全部的exceptions。
Session负责管理message listeners的执行顺序。任什么时候候,只有一个message listeners在运行。
b) Message Selectors
若是你的消息应用程序须要过滤收到的messages, 能够用JMS API中的message selector来让message consumer定义它所感兴趣的messages。Message selectors负责过滤到JMS provider的message,而不是到应用程序的。
message selector是一个含有表达式的字符串。表达式的语法是SQL92 conditional expression syntax的一个子集。当建立message consumer时, createReceiver, createSubscriber, 和createDurableSubscriber方法均可以定义某个message selector做为参数。
message consumer只接收headers和properties与selector匹配的messages。message selector不能根据message body的内容进行选择。
3.6 Message?消息组成
JMS 消息由如下几部分组成:消息头,属性,消息体
消息头(Header) - 消息头包含消息的识别信息和路由信息,消息头包含一些标准的属性如:JMSDestination,JMSMessageID 等。
消息头 由谁设置
JMSDestination send 或 publish 方法
JMSDeliveryMode send 或 publish 方法
JMSExpiration send 或 publish 方法
JMSPriority send 或 publish 方法
JMSMessageID send 或 publish 方法
JMSTimestamp send 或 publish 方法
JMSCorrelationID 客户
JMSReplyTo 客户
JMSType 客户
JMSRedelivered JMS Provider
属性(Properties) - 除了消息头中定义好的标准属性外,JMS 提供一种机制增长新属性到消息头中,这种新属性包含如下几种:
1. 应用须要用到的属性;
2. 消息头中原有的一些可选属性;
3. JMS Provider 须要用到的属性。
标准的JMS 消息头包含如下属性:
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 严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。
消息体(Body) - JMS API 定义了5种消息体格式,也叫消息类型,你可使用不一样形式发送接收数据并能够兼容现有的消息格式,下面描述这5种类型:
消息类型 消息体
TextMessage java.lang.String对象,如xml文件内容
MapMessage 名/值对的集合,名是String对象,值类型能够是Java任何基本类型
BytesMessage 字节流
StreamMessage Java中的输入输出流
ObjectMessage Java中的可序列化对象
Message 没有消息体,只有消息头和属性。
JMS API为每一种messages都提供了一种create方法。例如:
TextMessage message = queueSession.createTextMessage();
message.setText(msg_text); // msg_text is a String
queueSender.send(message);
在使用者一端, 必须将收到的Message 按照适当的message类型处理。 例如:
Message m = queueReceiver.receive();
if (m instanceof TextMessage) {
TextMessage message = (TextMessage) m;
System.out.println("Reading message: " + message.getText());
} else {
// Handle error
}
3.7 Exception Handling
JMS API的方法的Exception的根类是JMSException。JMSException类包括以下子类:
IllegalStateException
InvalidClientIDException
InvalidDestinationException
InvalidSelectorException
JMSSecurityException
MessageEOFException
MessageFormatException
MessageNotReadableException
MessageNotWriteableException
ResourceAllocationException
TransactionInProgressException
TransactionRolledBackException
4 JORAM产品介绍
JORAM是法国电信研究院支持的objectweb.org的开源JMS消息中间件产品。objectweb是一个很是活跃的开源中间件团体。JORAM支持sun规范,实现JMS1.1。
4.1 Joram4.3包括
一个Message Server(消息服务器),提供Java的消息服务功能。
一个JNDI Server。
一个客户端类,能够访问Message Server上的消息。
一个图形化的管理界面,配置管理Joram平台。
4.2 系统要求
硬件要求:
2000年后的intel架构pc机
256M RAM 5G硬盘
支持TCP/IP的网络硬件设备
软件要求:
操做系统:Linux, Windows 2000 and XP, 等
网络协议:TCP/IP
Java运行环境:JDK1.4
4.3 Joram产品包目录结构
doc/ ??Joram产品帮助文档
samples/ ??Joram产品使用举例
bin/... ??Joram例子执行程序
config/... ??Joram例子配置文件
class/... ??Joram例子class文件
run/... ??Joram例子运行目录
src/ ??Joram产品例子源代码
joram/... ??J2EE环境的Joram源代码
kjoram/… ??J2ME环境的Joram源代码
ship/lib/... ??Joram所用的lib包
ship/licenses/... ??Joram的许可证
5 JORAM Classic Samples使用说明
Joram classic samples使用简单的配置建立一个Message Server,发布一个Queue和一个Topic,并容许匿名用户访问。其中包口:一个消息发送的例子、一个消息发布的例子、一个标准的消息生产者的例子、一个消息接收的例子、一个消息订阅的例子、一个标准的消息消费者的例子、一个浏览Queue的例子。Joram平台运行在稳定模式。
能够利用ant工具直接运行Joram的上述例子
起动Joram消息Server:
ant single_server
也能够用命令行启动Joram Server,进入$JoramHome/samples/bin/目录,运行single_server.bat(win)或single_server.sh(unix)。如下操做均有相似的命令行工具。
创建Queue和Topic:
ant classic_admin
运行Sender发送消息例子:
ant sender
运行Receiver接受消息例子:
ant receiver
运行Browser 浏览Queue例子:
ant browser
运行消息订约的例子:
ant subscriber
运行消息发布的例子:
ant publisher
运行消息消费的例子:
ant consumer
运行消息生产的例子:
ant producer
以上操做也能够利用Eclipse3.1集成开发工具,将Joram例子直接导入成Java工程,而后利用例子中的build.xml文件运行。如图:
右击build.xml文件选择Run As ? Ant Build...

弹出窗口以下:每一个操做选项后面都有英文的注释信息,说明操做的内容,能够按照前面运行例子的顺序,依次运行便可。

Joram Server也能够经过命令行启动:
进入Joram产品的$JORAM_HOME/samples/bin目录,有下列批处理命令,其中.bat文件是windows环境下的命令,.sh文件是unix环境下的命令。
admin.bat  --启动Joram图形控制台界面
admin.sh
classadmin.bat  --在启动的Joram Server上建立去queue和topic
clean.bat  --清理Joram的运行目录
clean.sh
jmsclient.bat  --启动一个JMS客户端
jmsclient.sh
receive.bat  --启动一个接收消息进程
send.bat  --启动一个发送消息进程
single_server.bat  --启动Joram Server
single_server.sh
sslsingle_server.bat
sslsingle_server.sh
server.sh

公告
最新评论
总结: object到object[]要进行拆箱转换 object[]能够直接装箱成object (采云摘月)
仍是在后台代码中解决的!不过用JS方法解决不了,就是不爽!!!郁闷中 (采云摘月)
没有人遇到这类问题的吗?真背 (采云摘月)
谢谢了 (Dim.22)
想起一条笑话:我家电脑坏了,来了一个朋友,看了看后,说,你家有针么?我说有。而后半天时间就看到他用针在光盘上点点戳戳。而后电脑修好了。后来我才知道,他刻录了一张系统盘…… (梅桦)

引文来源   JMS : Java Message Service (Java消息服务)之一 - 采云摘月 - 博客园
相关文章
相关标签/搜索