`

jms学习笔记

阅读更多
Java消息服务支持两种消息模型:Point-to-Point消息(P2P)和发布订阅消息(Publish Subscribe messaging,简称Pub/Sub)。JMS规范并不要求供应商同时支持这两种消息模型,但开发者应该熟悉这两种消息模型的优势与缺点。

P2P消息模型是在点对点之间传递消息时使用。如果应用程序开发者希望每一条消息都能够被处理,那么应该使用P2P消息模型。与Pub/Sub消息模型不同,P2P消息总是能够被传送到指定的位置。

Pub/Sub模型在一到多的消息广播时使用。如果一定程度的消息传递的不可靠性可以被接受的话,那么应用程序开发者也可以使用Pub/Sub消息模型。换句话说,它适用于所有的消息消费程序并不要求能够收到所有的信息或者消息消费程序并不想接收到任何消息的情况。

发布/订阅
发布/订阅 (pub/sub) 消息传递系统支持事件驱动模型,在这种模型中,信息消费者和生产者参与消息的传输。生产者“发布”事件,而消费者“订阅”感兴趣的事件并消费事件。生产者把消息把与特定主题关联起来,然后消息传递系统根据消费者所注册的感兴趣主题,把消息路由给消费者。

点对点
在点对点消息传递系统中,消息是被路由到各个消费者的,该消费者维护“传入”消息队列。消息传递应用程序发送消息到指定队列,然后客户端从队列中检索消息。

JMS一般都不是用来整合一个系统,而是整合许多可能参与消息驱动环境的系统。JMS是一个用于开发和集成企业应用程序的重要的工具。因为许多公司都有以前遗留下来的系统和新近开发的系统综合起来的系统,消息的使用是整合整个企业的重要的步骤。

消息收发系统是异步的,也就是说,JMS 客户机可以发送消息而不必等待回应。

什么是消息
消息是一个用于在组件和应用程序之间通讯的的方法。消息之间的传递是点对点的。任何终端之间都可以相互接受和发送消息。并且每个终端都必须遵守如下的规则
创建消息 -> 发送消息 -> 接收消息 -> 读取消息

为什么要使用消息
理由很简单,消息是一个分布式的低耦合通讯方案。A发送一个消息到一个agent ,B作为接受者去agent上获取消息。但是A,B不需要同时到agent上去注册。agent作为一个中转为A,B提供搞效率的通讯服务。

开发者的关注点
走到这里,我也不想去解释jms spec上那些抽象且复杂的概念了,说的很白,1年多了我自己也没弄懂是个什么东西,也没时间从头到尾去仔细的看,同时我认为没必要,我所关注的是如何让jms跑起来,并且工作正常,所以spec只是个字典,当我需要用的时候才去查。

开发者的jms环境
遵守简单明了的原则,所谓jms环境只是2个对象
1> ConnectionFactory
2> Destination

JMS应用程序有四个组成部分:JMS服务提供者、消息管理对象、消息的生产者消费者和消息本身。

消息管理对象提供对消息进行操作的API。JMS API中有两个消息管理对象:ConnectionFactory和Destination,根据消息的消费方式的不同ConnectionFactory可以分为QueueConnectionFactory和TopicConnectionFactory,Destination可以分为Queue和Topic。用这两个管理对象可以建立到消息服务的会话。

消息的生产者和消费者。它们可以毫不相干,只需要消息的消费者知道如何使用消息即可。根据消息消费者数目的不同,消息的消费者分为两类:subscriber 和receiver,同样消息发送者也分为两类:Publisher和Sender。

消息。JMS API规定了五种消息:Message、MapMessage、TextMessage、ByteMessage、StreamMessage和ObjectMessage

消费形式的不同造成JMS有两组平行的API,这就是JMS的PTP(point to point)模型和PUB/SUB(publisher和subscriber、出版和订阅)模型。PTP的消息应用中一个消息只有一个消费者,消费后该消息即不再有效。而PUB/SUB应用中一个消息可以有多个订阅者,而且每个订阅者不一定非要处理该消息。

相对于更加传统的分布式计算模型,消息传递系统提供了许多强大的优势。首先,它们倡议在消息消费者和消息生产者之间进行“松散耦合”。在生产者和消费者之间存在着高级匿名:对于消息消费者,它不关心 谁 产生消息,在网络上生产者在 哪里,或者消息是 何时 产生的。


JMS应用中的消息发送
1、获得一个上下文环境:
Context ctx = new InitialContext();
2、通过JNDI查找来建立一个ConnectionFactory对象:
ConnectionFactory cf = (ConnectionFactory) ctx.lookup("java:JmsXA");
3、通过JNDI查找来建立一个或多个Destination对象:
Destination dest = (Queue) ctx.lookup("queue/A");  
4、通过ConnectionFactory创建一个JMS Connection连接:
Connection conn = cf.createConnection();
5、创建一个或多个JMS Session对象:
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
6、使用一个Session对象和Destination对象,合作创建一个MessageProducer(消息发送端):
MessageProducer msgp = session.createProducer(dest);   //此处的dest已经被强制为P2P Queue对象
QueueSender sender = (QueueSender) msgp; 
//此处发送端指明采用的是 PTP的方式来实现JMS。当然你也可以用Pub/Sub的方式来实现
Destination dest = (Topic) ctx.lookup("queue/A");  
...
TopicPublisher sender = (TopicPublisher) msgp;
7、通过某个Session建立一个或多个JMS Message对象:
//此处仅以文字消息发送为例,您也可以建立和发送MapMessage, BytesMessage, ObjectMessage, StreamMessage
TextMessage msg = session.createTextMessage();
msg.setText("消息详细内容");
8、在已有的连接上,开始发布我们已经建立好的消息对象:
sender.send(msg);
9、关闭已经建立的连接:
conn.close();

JMS应用中的消息接收
1-5:同发送过程的初始化步骤1-5,因为是消息的接收方,JNDI的寻址方式应该同于发送方,这里的JNDI相当于是双方接头的暗号。
6、使用一个Session对象和Destination对象,合作创建一个MessageConsumer(消息接收端):
MessageConsumer msgconsumer = session.createConsumer(dest);
7、启动这个已经建立的连接,准备接收来自发送方的消息:
conn.start();
8、截获来自发送端的消息:
TextMessage msg = (TextMessage) msgconsumer.receive();
String message = msg.getText();
9、关闭已经建立的连接:
conn.close();

以上的消息接收端成功的接收了一条消息,如果我们要监控JMS消息的接收事件,需要在第7步之前,声明一个实现了MessageListener接口的对象:
MessageListener ml = new JmsListenner();  
msgConsumer.setMessageListener(ml); 
这里的JmsListenner是我们自定实现的一个MessageListener,其中关键的事件是:
public void onMessage(Message message);
一个Session对象可以同时控制旗下的多个Consumer对象和MessageListener对象,但是这个Session是一个单线程模式的传递机制,即:必须在当前Message对象被onMessage处理之后,才能继续接收下一条异步传送过来的Message对象。
分享到:
评论
2 楼 jlcon 2009-05-08  
这篇文章写得条理清楚非常不错
1 楼 6308907 2008-10-07  
你好,我正在研究JMS,其中有很多问题不明白,希望你能够教我一下,谢谢了,我的qq是6308907,或者是MSN:tianjinsong1983@hotmail.com,谢谢了!

相关推荐

Global site tag (gtag.js) - Google Analytics