日期:2014-05-16  浏览次数:20564 次

JMS消息驱动MDB

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?JMS消息驱动MDB

Java 消息服务支持两种消息模型:Point-to-Point 消息(P2P)和发布订阅消息(Publish Subscribe messaging,简称Pub/Sub)

?

????? 发布/订阅模式此模式类似于看电视。很多电视台都在广播自己的信号,而同时又有很多人在观看这些节目。不过,需要区别的是,JMS 中通信是双向的,一般来说接收者同时也可能是一个发布者,因为它收到消息后需要回复。订阅者(收看者)注册自己感兴趣的特
定主题,发布者则创建发布到所有订阅者的消息。这时候有个关键的术语就叫Topic(主题),一般来说对应服务器的某个JNDI 地址,发送者向里面发送信息,接受者则订阅此Topic 即可

?

????? 点对点方式 此模式类似于语音信箱,可以给此信息发送语音留言,接受者会阅读完毕后删除此信息。这种模式下,一条消息只能被一人接受,而且也只能阅读一次。这可以认为是发布/订阅模式的简化为一个电台一个接收者时候的情形。此时对应的术语叫Queue(队
列),两个人同时连接到同一队列,才能收发消息

?

?

?

JMS 消息由以下部分组成:
? Header(头)- 所有消息都支持相同的头字段集合。头字段包含客户端和提供者用于标识和路由消息的值。
? Property(属性)- 每个消息都包含一个内置工具,用于支持应用程序定义的属性值。属性为支持应用程序定义的消息过滤提供了一种有效的机制。
? Body(正文)- JMS API 定义了几种消息正文类型,涵盖了当前使用的大多数消息传递样式。

?

消息正文

JMS API 定义了五种消息正文类型:
? Stream(流)- StreamMessage 对象的消息正文包含 Java 编程语言原始值流(“Java 基本类型”)。按顺序填充和读取。
? Map(映射)- MapMessage 对象的消息正文包含一组名称-值对,其中名称是 String对象,值是 Java 基本类型。可以根据名称按顺序或随机访问这些条目。条目的顺序是不确定的。
? Text(文本)- TextMessage 对象的消息正文包含 java.lang.String 对象。此消息类型可用于传输纯文本消息和 XML 消息。
? Object(对象)- ObjectMessage 对象的消息正文包含 Serializable Java 对象。

? Byte(字节)- BytesMessage 对象的消息正文包含未解释的字节流。此消息类型可以按字面意义编码正文,以匹配现有的消息格式。在大多数情况下,可以使用更易用的其他正文类型。尽管 JMS API 允许将消息属性用于字节消息,但一般不使用它们,因为包含属性可能会影响格式。

?

消息头
JMSCorrelationID 头字段用于连接一个消息与另一个消息。它通常连接应答消息与请求消息。
JMSCorrelationID 可以保存特定于提供者的消息 ID、特定于应用程序的 String 对象,或者提供者-本机 byte[] 值。

?

消息属性
Message 对象包含一个内置工具,用于支持应用程序定义的属性值。实际上,这提供了一种将特定于应用程序的头字段添加到消息的机制。
属性允许应用程序通过消息选择器让 JMS 提供者使用特定于应用程序的标准为自己选择或过滤消息。

?

?

?

?

JMS 编程模型

JMS 的使用者一共要完成两个任务,一是发送消息,二是接收消息。

一、发送消息

1. 初始化JNDI;
2. 通过 JNDI 查找 ConnectionFactory(连接工厂);
3. 使用 ConnectionFactory 创建 JMS Connection(连接);
4. 使用连接创建会话(Session);
5. 通过 JNDI 查找目的地(主题或者队列,Topic/Queue);
6. 创建消息生产器/队列发送者(TopicPublisher/QueueSender);
7. 创建消息;
8. 给消息设置一些额外属性(可选);
9. 发送消息;
10. 关闭会话。

二、接收消息