235
8
用JMS编程
在本章中,我们将讨论 Java 消息发送服务(JMS)接口概念和 MQSeries 实施,以及如
何使用 JMS 编程。我们将在消息发送编程模式的上下文中探讨 JMS 概念。
236
8.1 什么是JMS?
与 JDBC API for databases 一样,Java Message Services(JMS)是消息发送的标准 API。
JMS 规范(1.0.2)由 Sun Microsystems 开发,IBM 和其他企业消息发送销售商、事务处
理销售商以及 RDBMS 销售商都积极参与了开发过程。JMS 为 Java 程序与对消息发送
系统对象进行各种操作的消息发送系统进行互动提供了一个常见的模型。程序对消息发
送系统对象进行的常见操作包括创建消息、发送消息、接收消息以及从企业消息发送系
统中读取消息。JMS 为那些用 Java 开发的程序提供了一种访问这些消息发送系统操作
的常见方法。
JMS 具有两种消息发送风格,或者说它具有两个域:
一对一或点到点模型;
发布/预订模型。
JMS 仅仅是种规范。每个企业消息发送系统销售商都必须就其特定的消息发送系统提供
实施规范的类。
在本章中,我们将描述 JMS API 的 MQSeries 实施、讨论 JMS API 概念和 MQSeries 的
JMS 实施能力,并讲解在可以利用 MQSeries JMS 实施的不同情境中如何利用 MQSeries
JMS。
为什么要使用 JMS?
JMS 标准非常重要,其原因在于:
它是第一个获取广泛跨行业支持的企业消息发送 API;
它提供的标准消息发送概念和惯例适用于广泛的企业消息发送系统,因而简化了
企业应用程序的开发;
它可以利用现有的、企业证明成功可行的消息发送系统;
它添加了完全用现有非 JMS 客户机解释的新 JMS 客户机,从而允许您扩展现有的
基于消息的应用程序;
它允许您可以编写便携性强的基于消息的商业应用程序。
237
8.2 概述
JMS 是定义 JMS 客户机如何访问企业消息发送产品功能的一系列接口和相关语义。我
们这里所描述的消息是指企业应用程序所使用的异步请求、报表或事件。它们既包含协
同这些系统所需的重要信息;又包含着描述特定商业行为的精确格式化的数据。通过这
些消息的交流,每个应用程序都能跟踪企业的发展。
JMS 定义了一系列常见的企业消息发送概念和功能。它最大限度地减少了 Java 语言程
序设计人员在使用企业消息发送产品前必须学会的概念集。也最大限度地加强了消息发
送应用程序的便携性。JMS 标准虽然提供了独立于不同销售商的编程接口,但是并不定
义出通讯协议。
JMS 模型
JMS 定义了消息传递服务的一般视图。理解该视图,并弄清它是如何映射到底层的
MQSeries 传输上的,相当重要。一般 JMS 模型是建立在 Sun 的 javax.jms 包所定义的接
口上的,请见图 8-1。
238
图
8
-
1 JMS
模型
连接
连接提供了到底层传输的访问,并被用来创建会话。在 MQSeries 上下文中,连接提供
了储存参数,如队列管理器名、远程主机名(在 Java 客户连接性中)等的地方。换言之,
MQSeries JMS 连接一般都在 Java虚拟机之外分配 MQSeries 资源。连接也支持同时使用。
连接可以提供以下好处:
包括与 JMS 供应方的开放式连接。它通常代表客户机和供应方服务端口之间的一
个开放的 TCP/IP 槽;
它的创建就是客户机认证发生之处;
它可以指定唯一的客户机标识符;
239
它提供 ConnectionMetaData;
它支持可选的 ExceptionListener。
由于建立连接时完成了认证和通讯设置,因此连接相对来说是个重量级的 JMS 对象。
大多数客户机都使用单一的连接进行消息发送。其他更先进的应用程序可能会使用几个
连接。JMS 并不为使用多个连接而设计原因;但是,这样做可能有操作上的原因。
JMS 客户机一般创建一个连接、一个或多个会话以及许多消息生成器和使用者。当创建
连接时,它处在停止模式,这就是说没有消息再被送达。
重点:连接是在
停止
模式中创建的。
通常,直到设置完成前,连接都处在停止模式中。在完成时,将调用连接的 start()方
法,而消息则开始到达连接的使用者。此设置惯例可以在客户机仍在进行设置过程中尽
可能减少异步消息送达所带来的任何客户机混乱。
连接可以立即启动,而设置可在随后进行。这样做的客户机必须在设置过程中就准备好
处理异步消息送达。
提示:消息生成器可以在停止连接时发送消息。
不是直接创建连接的,而是利用连接库建立的。库对象可以储存在 JNDI 名称空间中,
从而将 JMS 应用程序与供应方特定信息隔离开来。连接库对象是利用 MQSeries JMS 管
理工具 JMSAdmin 创建的。该工具使得管理员可以给 JNDI 名称空间定义 MQSeries JMS
对象的 8 种类型。请参见第 8.4.9 节《利用 JMSAdmin 以 VisualAge for Java 管理 JMS JNDI
对象》(见本书第 260 页)。
创建连接
客户机利用连接库来创建连接。要使用何种连接库类型取决于您想要哪种类型的连接:
就 PTP 连接而言,我们利用 QueueConnectionFactory 或 XAQueueConnectionFactory
来获取 QueueConnection 或 XAQueueConnection;