您的位置:首页 > 其它

jms详解

2010-08-06 11:08 127 查看
Java Message Service 规范 1.1 声称:

JMS 是一组接口和相关语义,它定义了 JMS 客户如何访问企业消息产品的功能。

在 JMS 之前,每一家 MOM 厂商都用专有 API 为应用程序提供对其产品的访问,通常可用于许多种语言,其中包括 Java
语言。JMS 通过 MOM 产品为 Java 程序提供了一个发送和接收消息的标准的、便利的方法。用 JMS 编写的程序可以在任何实现 JMS
标准的 MOM 上运行。

JMS 可移植性的关键在于:JMS API 是由 Sun 作为一组接口而提供的。提供了 JMS 功能的产品是通过提供一个实现这些接口的提供者来做到这一点的。

开发人员可以通过定义一组消息和一组交换这些消息的客户机应用程序建立 JMS 应用程序。

JMS 的目标

更好地理解 JMS 有助于了解 JMS 规范的制定者设置的目标。

现在,市场上有许多企业消息产品,生产这些产品的几家公司也参与了 JMS 的开发。

现有的这些系统的能力和功能各不相同。这些制定者知道如果 JMS 结合所有现有系统的所有功能,那么它会变得过于复杂。同样,他们相信,他们也不能让 JMS 只局限于所有系统共有的那些特性。

制定者相信,让 JMS 包括实现“高级的企业应用程序”所需要的所有功能是很重要的。

JMS 规范中声明, JMS 的目标是:

定义一组消息公用概念和实用工具。

最少化程序员使用消息时必须学习的概念。

最大化消息应用程序的可移植性。

最小化实现一个提供者所需的工作量。

为点对点和 pub/sub 域 提供客户机接口。“域”是用于在前面讨论的消息模型的 JMS 术语。(注意:提供者不需要实现两个域。)

JMS 1.1 中的新内容:统一域

在 JMS 1.1 以前的版本中,每一个域都有自己的特定于该域的一组客户机接口。JMS 版本 1.1
提供了单一的一组接口,它允许客户机可以在两个域中发送和接收消息。这些“域无关的接口”保留了每一个域的语义和行为,是实现 JMS
客户机的最好选择。支持特定于域的接口是为了向后兼容性,新的开发不该使用它。

统一域的好处是:

它展示了用于客户机编程的更简单的编程模型。

队列和主题的操作可以是同一事务的一部分。

它为 JMS 提供者提供了优化其实现的机会。

哪些是 JMS 没有提供的

以下特性在MOM 产品中常见,但在 JMS 规范中没有出现。尽管 JMS 制定者承认它们对于开发功能强大的消息应用程序很重要,但是这些功能是特定于 JMS 提供者的。

JMS 提供者可以以任何他们愿意的方式自由实现这些功能:

负载平衡和容错

错误和咨询系统消息和通知

管理

安全性

Wire 协议

消息类型仓库

JMS概述和体系结构

应用程序

JMS 应用程序由以下元素组成:

JMS 客户机。 用 JMS API 发送和接收消息的 Java 程序。

非 JMS 客户机。 认识到传统程序通常整个 JMS 应用程序的一部分是非常重要的,在规划时必须优先考虑它们的存在。

消息。就JMS 应用程序设计而言,通过JMS 和非 JMS 客户机所交换的消息的格式和内容是完整的。

JMS 提供者。 如前所述,JMS 定义了一组接口,供应者必须提供特定于其 MOM 产品的具体实现。

管理对象。 消息系统提供者的管理员创建的、独立于提供者的专有技术的对象。

管理对象

MOM 产品的提供者在实现消息时使用的机制和技术有很大不同。为了保持 JMS 客户机的可移植性,实现了 JMS 接口的对象必须与提供者的专有技术隔离。

完成这项任务的机制是 管理对象。这些实现 JMS 接口的对象由提供者的消息系统的管理员创建,并被放置在 JNDI 名字空间中。

然后由 JMS 程序检索这些对象,通过它们实现的 JMS 接口访问这些对象。JMS 提供者必须提供允许创建受管理对象及它们在 JNDI 名字空间中的存放地的工具。

有两种受管理对象:

ConnectionFactory:用于创建到提供者的底层消息系统的连接。

Destination:用 JMS 客户机来指定正发送消息的目的地或正接收消息的来源。

尽管受管理对象本身就是特定于提供者实现的类的例子,但可以使用可移植机制(JNDI)检索它们,并且可以通过可移植接口(JMS)访问它们。JMS 程序只需要知道管理对象的 JNDI 名称和 JMS 接口类型即可,无需了解特定于提供者的知识。

接口

JMS 定义了一组封装各种消息概念的高级接口。而这些接口又因为两个消息域——PTP 和 pub/sub——进行了进一步地定义和定制。

高级接口包括:

ConnectionFactory:一个创建 Connection 的受管理对象。

Connection:连接到提供者的活动连接。

Destination:一个封装消息目的地的身份的受管理对象,如消息的来源地和发送地。

Session:发送和接收消息的单线程环境。为了简化,并且因为 Session 控制事务的缘故,通过多个线程进行并发访问受到了限制。可以将多个 Session 用于多线程应用程序。

MessageProducer:用于发送消息。

MessageConsumer:用于接收消息。

接口:JMS 1.1 中的变化

在 JMS 以前的版本中,高级接口是特定于域的接口的父接口,并且只包含在两个域中共有的那些功能。JMS 提供者没有提供高级接口的实现。在
JMS 1.1 中,一些高级接口现在则被认为是“公用接口”,并且它们包含两个域的所有功能; JMS
提供者必须提供这些接口的实现。尽管公用接口仍然是特定于域的接口的父接口,但它们现在是 JMS
客户机编程的首选方法,并且它们提供特定于域的接口只为了后向兼容。

下面列出了一些公用接口。

JMS 公用接口 PTP 域 Pub/sub 域

ConnectionFactory QueueConnectionFactory TopicConnectionFactory

Connection QueueConnection TopicConnection

Destination Queue Topic

Session QueueSession TopicSession

MessageProducer QueueSender TopicPublisher

MessageConsumer QueueReceiver,QueueBrowser TopicSubscriber

统一有公用接口的域会导致继承这些方法的一些特定于域的类不再适合它的域。如果在客户机代码中出现这种情况,JMS 提供者需要使用 IllegalStateException。

开发 JMS 程序

一个典型的 JMS 程序要经过以下步骤才能开始产生和使用消息:

通过 JNDI 查询 ConnectionFactory 。

通过 JNDI 查询一个或者多个 Destination。

用 ConnectionFactory 创建一个 Connection。

用 Connection 创建一个或者多个 Session。

用 Session 和 Destination 创建所需要的 MessageProducer 和 MessageConsumer。

启动 Connection。

这时,消息就可以开始流动,应用程序可以根据需要接收、处理和发送消息。 在后面几节中,我们将开发 JMS 程序,您将会看到这些步骤的细节。

消息

消息系统的核心当然是消息。JMS 为不同类型的内容提供了几种消息类型,但所有消息都是从 Message 接口派生出来的。

Message 分为三个组成部分:

header 是一组标准字段,客户机和提供者都用它们来标识和路由消息。

Properties
提供了一个给消息添加可选标题字段的实用工具。如果应用程序需要用标准标题字段没有提供的方法对消息进行归类或分类,那么可以为消息添加一个属性来实现这
种归类和分类;提供了 set<Type>Property(...) 和 get<Type>Property(...)
方法来设置和获得各种 Java 类型的属性,其中包括 Object。JMS 定义了提供者可以选择性提供的一组标准属性。

消息的 body 包含将 发送到接收应用程序的内容。每一个消息接口都专用于它所支持的内容类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: