IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

IBM WebSphere 开发者技术期刊: 为 WebSphere MQ 开发独立的 Java 应用程序

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 初级

Bobby Woolf, WebSphere J2EE 顾问, IBM Software Services for WebSphere

2005 年 4 月 01 日

本文阐述了如何开发 Java™ 应用程序,通过使用 IBM® WebSphere® MQ, 实现消息的发送及接收。该应用程序使用 J2EE™ 的标准 JMS 及 JNDI API,但并不需要将其部署在 J2EE 应用程序服务器上。

引言

使用 Java Messaging Service (JMS) 消息的 J2EE 应用程序是很普遍的,并且有大量相关的文档介绍如何使他们工作得更好。然而不足的是,介绍关于不通过应用程序服务器来使用 JMS 消息传递提供程序开发 Java 2 Standard Edition (J2SE) 应用程序这类的文档就相对欠缺些。本文说明如何开发一个用 WebSphere MQ 作为 JMS 和 JNDI 客户端工作的独立的 Java 应用程序。这种应用程序仍然可以利用 JMS 异步消息传递,而不需要将其部署在 J2EE 应用程序服务器(例如 IBM WebSphere Application Server)上。





回页首


为什么是独立应用程序?

人们可能会问的第一个问题是:为何配置一个独立的应用程序来使用异步消息传递?J2SE 是为了那些通常在一台计算机上单个 Java 虚拟机(JVM)中的简单应用程序的开发而设计的。使用消息传递的应用程序通常在 Java 2 Enterprise Edition(J2EE)平台上开发,这些应用程序为企业级应用程序提供多种服务,例如消息传递等。消息传递由 JMS 提供,JMS 包含一个标准 API 来访问消息传递系统。JMS 应用程序也通过 Java 命名与目录接口(JNDI)API 来访问消息系统的受管理资源,也就是连接工厂和目的地。

即使是为台式机单用户而设计的应用程序可能也需要与其他应用程序或服务进行集成。这种应用程序利用异步消息传递来完成工作,并且作为一个 Java 应用程序,应使用 JMS API(JNDI)来执行消息传递。

独立的 JMS

您可能已经有使用 JMS 及 JNDI 编写的应用程序。本文包含一个下载文件,其中有通过 main() 方法运行的 JMS 客户端简单范例。虽然该应用程序的实用价值不高,但足以演示消息传递。接下来,我们将介绍如何修改样例应用程序,以使其与 WebSphere MQ 合作。您也可以对您的应用程序进行类似处理。

这个样例应用程序与那些使用 JNDI 从 JMS 提供程序中访问受管理资源(连接工厂及目的地)并使用 JMS 发送接收消息的 J2EE 程序相似。(由于那些是 Enterprise JavaBean™ 类型的 J2EE 应用程序,因此,该样例应用程序无需使用消息驱动 bean 。)

本文中所涉及的配置需要以下前提:

  • 目前使用的是基于 Microsoft® Windows® 版本的 WebSphere MQ V5.3。其他平台的版本应该也可以使用,但目前尚未测试过。
  • 本地机器已安装 WebSphere MQ(URL 指向为 localhost)。
  • WebSphere MQ 安装有队列管理器 QMGR,且在 1414 端口运行其 TCP 监听程序。

如果您的 WebSphere MQ 安装与此不同,则必须按以上说明对样例进行修改。





回页首


点到点开发

首先要关注的是,如何利用队列实现点到点消息传递。设置这个应用程序和消息传递系统需要以下步骤:

  1. 获得并安装 WebSphere MQ 的 support pac。
  2. 修改应用程序的 JNDI 代码来使用 support pac。
  3. 修改管理工具来使用 support pac。
  4. 使用必需的 JMS 资源来配置 WebSphere MQ。
  5. 创建或修改使用 support pac 的应用程序执行脚本。
  6. 运行应用程序。

应尽量减少不必要的代码修改。实际上,如果您的代码正使用 jndi.properties 文件, 那么只需修改该文件即可。代码的主要变动应是:修改运行代码的脚本以在其类路径上有必需的 Java 应用程序资源((JAR)文件。

1. 获得并安装 WebSphere MQ 的 support pac

本例中使用的是 WebSphere MQ Version 5.3。该版本并不能提供支持 JMS 程序所需的所有功能。它包括 JMS 接口实现,而非 JNDI 接口。要在 WebSphere MQ 中添加 JNDI 支持,则需安装 support pac ME01(WebSphere MQ Initial Context),它依次需要 support pac MS0B(用于 PCF 的 MQSeries Java 类)。 (参见 参考资料。)

这些 support pac 的安装只要解压缩即可。每个都包含以下将用到的 JAR 文件。(在该样例脚本中,假设 JAR 文件已添至 WebSphere MQ 的 Java\lib 目录。)除确保 JAR 文件可用及阅读相应的文档外,无需执行其他的安装。

2. 修改应用程序的 JNDI 代码以使用 support pac

在 J2EE 应用程序中使用 JNDI 是非常容易的。您只需创建 InitialContext (不含参数)就可开始使用。这是因为 JNDI 上下文由 J2EE 管理,包括含有您代码的组件上下文(Web 应用程序或者 EJB 类)。

对于独立的 J2SE 应用程序来说,除了 J2SE 容器(基本上为简单的 JVM)外,并无 J2EE 容器管理 JNDI 上下文。这个组件模型非常简单 -- 没有 Web 应用程序,没有 EJB——因此所有的代码都具有相同的 JNDI 上下文。

在 J2EE 里,您通常可以说:

Context context = new InitialContext();

不含参数,并且得到所需的 JNDI 上下文。

在 J2EE 里,创建初始上下文稍微有些难度。您需要使用不同的构造函数,InitialContext(Hashtable), 如下:

				
Properties env = new Properties();
// fill in the context properties
Context context = new InitialContext(env);

通过这些上下文属性,JNDI 能为您创建所需的上下文。在此,我们想创建可访问 WebSphere MQ 的上下文,即我们所安装的样例。我们可通过使用以下代码实现:

				
Properties env = new Properties();
env.put(
	Context.INITIAL_CONTEXT_FACTORY, 	
	"com.ibm.mq.jms.context.WMQInitialContextFactory");
env.put(Context.PROVIDER_URL, "localhost:1414/SYSTEM.DEF.SVRCONN");
Context context = new InitialContext(env);

这些代码建立了一对上下文属性:

  • INITIAL_CONTEXT_FACTORY
    我们将使用该 JNDI 类的名字创建 InitialContext。由于我们要通过 JNDI 来访问 WebSphere MQ ,我们使用的初始上下文工厂是一个 WebSphere MQ 类。(这个类由上面介绍的 ME01 support pac 提供。)
  • PROVIDER_URL
    将指明如何查找运行的 WebSphere MQ 安装。这和 HTML 文件或者 JDBC 数据源的 URL 很类似,该 URL 将指明 JNDI 如何利用 support pac 提供的实现来查找并且访问 WebSphere MQ。

您的 PROVIDER_URL 可能和此处出现的值不同。如果您不在安装 WebSphere MQ 的计算机上运行客户端应用程序,那么您必须将装有 WebSphere MQ 计算机的主机名或者 IP 地址设置为 localhost。同样地,1414 端口是 WebSphere MQ 中首队列管理器默认的监听端口。如果您的安装端口不同,或想另外用队列管理器,则需重新指定端口。

这便是所需更改的全部代码,该代码例示了初始的 JNDI 上下文。从这里,您的代码同样使用 JNDI 访问 JMS 连接代理和 JMS 队列,并且使用它们来发送和接收消息。您甚至可以在属性文件里保存这些 JNDI 上下文属性(标准名称为 jndi.properties)。然后,不用再对代码做任何的变动就可以修改这些属性了。

3. 修改管理工具以使用 support pac

WebSphere MQ 的 JMS 管理工具 JMSAdmin.bat,位于 MQ 安装路径的 Java\bin directory 中。需通过 MS0BME01 对 support pac 进行修改。

修改脚本类路径来添加 support pac 的com.ibm.mq.pcf.jarmqcontext.jar JAR 文件,如下所示(最好不要将 JAR 文件放在 bin 目录下):

set CLASSPATH=%CLASSPATH%;mqcontext.jar;com.ibm.mq.pcf.jar

脚本在运行管理类时,将使用新的类路径,com.ibm.mq.jms.admin.JMSAdmin

JMS 管理工具的配置文件 JMSAdmin.config,也必须修改。为文件添加行(并注释掉相应的行)以进行如下设置:

				
INITIAL_CONTEXT_FACTORY=com.ibm.mq.jms.context.WMQInitialContextFactory
PROVIDER_URL=localhost:1414/SYSTEM.DEF.SVRCONN

在此,您安装的 URL 可能又不同。然而,这些值与应用程序里 JNDI 代码中所用的值相同。(JMSAdmin 是其它 WebSphere MQ 客户端,如您的应用程序。)

4. 使用必需的 JMS 资源配置 WebSphere MQ

JMS 管理工具是交互运行的,但是用其处理能够被编辑并重复运行的脚本相对就容易些。可以任意规定该脚本的文件名;按照惯例而言,扩展名是 .scp。在本例中,文件名是 sampleconfig.scp。重要的两行如下:

				
def qcf(SampleQCF) qmgr(QMGR) tran(client) chan(SYSTEM.DEF.SVRCONN) +
    host(localhost) port(1414)
def q(SampleQueue) qmgr(QMGR) qu(SAMPLE.QUEUE)

在这两行中,用 JNDI 名 SampleQCF 及名为 SampleQueuejavax.jms.Queue 创建 javax.jms.QueueConnectionFactory。该脚本假设队列管理器为 QMGR,如果您的队列管理器不同名则要修改脚本。如同以上的 PROVIDER_URL 值,如果您是在不同的机器上安装或您的队列管理器在不同的端口运行,则需要在脚本中修改这些设置。

一旦设置好脚本,从命令行运行脚本:

C:\WebSphere MQ\Java\bin> JMSAdmin -v < sampleconfig.scp

在 WebSphere MQ Explorer 中,您将看到在 Console Root\WebSphere MQ\Queue Managers\QMGR\Queues 文件夹中命名为 SampleQueue 的队列。

5. 创建或修改使用 support pac 的应用程序执行脚本

该 JMS 客户端的示例脚本应包含类路径中的以下几项:

  • JMS API:
    %MQ_JAVA_INSTALL_PATH%/lib/jms.jar
  • J2EE Connector API:
    %MQ_JAVA_INSTALL_PATH%/lib/connector.jar
  • WebSphere MQ client:
    %MQ_JAVA_INSTALL_PATH%/lib/com.ibm.mq.jar
  • WebSphere MQ JMS implementation:
    %MQ_JAVA_INSTALL_PATH%/lib/com.ibm.mqjms.jar
  • MS0B support pac JAR file:
    com.ibm.mq.pcf.jar
  • ME01 support pac JAR file:
    mqcontext.jar

在上面中已提及,应用程序的 JNDI 代码必须设置 INITIAL_CONTEXT_FACTORYPROVIDER_URL 值。如果是从 jndi.properties 文件里读取这些设置,那么,该 jndi.properties 文件必须保存在应用程序类路径中。

6. 运行应用程序

接下来,我们将测试应用程序。打开一个发送方和一个接收方窗口。用示例代码转至目录,运行发送方和接收方程序。然后输入消息 this is a test。您将在发送方窗口里看到:

				
C:\standalonewmq> StandaloneSender
java -cp "standalonewmq.jar;. . ." com.ibm.examples.StandaloneSender
Sender started.
Enter a message: this is a test
Sent message <this is a test> with ID <ID:414d5120. . .20005001>
Enter a message:
Sender stopped.
C:\standalonewmq>

以下可在接收方窗口中看到:

				
C:\standalonewmq> StandaloneReceiver
java -cp " standalonewmq.jar;. . ." com.ibm.examples.StandaloneReceiver
Receiver started.
Received message <this is a test> with ID <ID:414d5120. . .20005001>
Receiver stopped.
C:\standalonewmq>

结果将显示,ID 结束于 20005001this is a test 消息已被发送和接收。样例程序运行正常。





回页首


开发发布/订阅

这个示例应用程序也包含了适合主题的发布者及订阅者。这个发布/订阅样例以安装了点到点消息传递作为前提。需要附加以下步骤:

  1. 取得并安装 WebSphere MQ 的发布/订阅 support pac。
  2. 配置 WebSphere MQ 的发布/订阅并启动代理。
  3. 使用必需的 JMS 资源配置 WebSphere MQ。
  4. 创建或修改应用程序执行脚本。
  5. 运行应用程序。

当为样例中点到点部分设置 WebSphere MQ 时,我们已经执行了其他步骤。

1. 取得并安装 WebSphere MQ 的发布/订阅 support pac

WebSphere MQ V5.3 不包含发布/订阅的支持。因此,您需添加 support pac MA0C(WebSphere MQ (MQSeries)——发布/订阅)。

支持发布/订阅

包含 WebSphere Business Integration Event Broker 和 WebSphere Business Integration Message Broker 在内的其它 IBM 产品,不仅可支持 WebSphere MQ 发布/订阅的实现,还可支持如 IP 多点传送等的实现。此类产品不在本文作介绍。

WebSphere MQ V5.3 最近的补丁(如 Fix Pack 8, CSD08)包含了 MA0C,因此,如果您已经安装最近的补丁,可跳过安装 MA0C。若尚未确定是否已安装 support pac,请先尝试安装。如果它已经被安装,安装程序将简要地提示您然后自动跳过。

按向导的说明,安装 support pac,下载(参见参考资料)并运行。

2. 配置 WebSphere MQ 的发布/订阅并启动代理

安装好发布/订阅 support pac 后,您需对其进行配置并启动。在此,如果尝试运行发布或订阅(想做就做吧),将出现以下错误:

				
javax.jms.JMSException: MQJMS5087: Unexpected error 2085 
accessing internal queue SYSTEM.JMS.REPORT.QUEUE

该错误表示,尚未创建 WebSphere MQ 所需的内部队列以支持 JMS 发布/订阅。要创建这些队列,用相应的队列管理器(假设您的队列管理器命名为 QMGR)中 WebSphere MQ bin 目录(不是 Java\bin 目录)下的配置文件,运行 runmqsc 程序。当您运行命令时,您应当看到如下输出结果:

				
C:\WebSphere MQ\bin> runmqsc QMGR < MQJMS_PSQ.mqsc
. . .
8 MQSC commands read.
No commands have a syntax error.
All valid MQSC commands were processed.

确保已运行队列管理器的发布/订阅代理。可运行 dspmqbrk 命令进行检查。如果输出结果如下,则可能没有运行:

				
C:\WebSphere MQ\bin> dspmqbrk -m QMGR
MQSeries Publish/Subscribe broker for queue manager QMGR not active

要启动代理,运行命令 strmqbrk

				
C:\WebSphere MQ\bin> strmqbrk -m QMGR
MQSeries Publish/Subscribe broker started for queue manager QMGR.

如再运行 dspmqbrk,将提示代理已经运行。(您可以运行 endmqbrk -m QMGR 来停止代理。)

3. 使用必须的 JMS 资源配置 WebSphere MQ

我们现在需要使用主题连接工厂及主题来配置 WebSphere MQ。如果您事先已运行 sampleconfig.scp

C:\WebSphere MQ\Java\bin> JMSAdmin -v < sampleconfig.scp

那么,您已经创建了这些资源并且不需要再次运行。现在关注以下该部分脚本的作用。在配置脚本的与其相关的两行为(假设您的队列管理器为 QMGR):

				
def tcf(SampleTCF) qmgr(QMGR)
def t(SampleTopic) topic(sampletopic)

第一行创建在 JNDI 中以 SampleTCF 名注册的 javax.jms.TopicConnectionFactory。第二行创建名为 SampleTopicjavax.jms.Topic

4.创建或修改应用程序执行脚本

为运行 JMS 客户端,样本脚本必须列出针对点到点的类路径条目。此外,发布签署支持使用 XA (即分布式事务处理),所以脚本在类路径里也需要的这个条目:

  • the JTA API:
    %MQ_JAVA_INSTALL_PATH%/lib/jta.jar

5. 运行应用程序

现在,进行发布测试。打开三个命令窗口,一个为发布者两个位订阅者。转至样例代码路径,运行发布者及订阅者。然后输入消息,如 broadcast this,在发布者窗口中将出现:

				
C:\standalonewmq> StandalonePublisher
java -cp "standalonewmq.jar;. . ." com.ibm.examples.StandalonePublisher
Publisher started.
Enter a message: broadcast this
Published message <broadcast this> with ID <ID:414d5120. . .20005b02>
Enter a message:
Publisher stopped.
C:\standalonewmq>

在订阅者窗口将出现:

				
C:\standalonewmq> StandaloneSubscriber
java -cp "standalonewmq.jar;. . ." com.ibm.examples.StandaloneSubscriber
Subscriber started.
Received message <broadcast this> with ID <ID:414d5120. . .20002406>
Subscriber stopped.
C:\standalonewmq>

另一个订阅者窗口将出现:

				
C:\standalonewmq> StandaloneSubscriber
java -cp "standalonewmq.jar;. . ." com.ibm.examples.StandaloneSubscriber
Subscriber started.
Received message <broadcast this> with ID <ID:414d5120. . .20002407>
Subscriber stopped.
C:\standalonewmq>

一个发布消息被发送给两个订阅者。每个订阅者消息都有不同的 ID,这是因为每个订阅者都得到其消息的副本。





回页首


结束语

在本文中,介绍了 J2SE 应用程序如何使用 JMS 及 JNDI 的 WebSphere MQ,而无需在 J2EE 容器里展开(如 WebSphere Application Server)。我们了解了以下方面的内容:

  • 如何获取适当的 JNDI 初始环境。
  • 如何适当地利用 WebSphere MQ 包含的 JAR 文件设置类路径。
  • 所需的 support pac 类型以及相关使用方法。
  • 如何配置 WebSphere MQ。
  • 如何管理 WebSphere MQ 资源并作为 JMS 资源,使用 JNDI 进行访问。

您可以对现有的应用程序进行修改并且开发新的应用程序了。






回页首


下载

名字大小下载方法
StandaloneWMQCode.zip16 KB  FTP|HTTP
关于下载方法的信息


参考资料

您可以参阅本文在 developerWorks 全球站点上的 英文原文

IBM 产品

IBM 支持

Java 规范

其他参考资料



关于作者

Photo: Bobby Woolf

Bobby WoolfIBM Software Services for WebSphere(ISSW)的一名 WebSphere J2EE 顾问。Bobby 协助客户使用 WebSphere Studio Application Developer 开发 WebSphere Application Server 的应用程序。他也是 Enterprise Integration PatternsThe Design Patterns Smalltalk Companion 的作者之一。他在 IBM developerWorks Web 站点上有一个 blog,名为 J2EE in Practice。Bobby 经常在讨论会上发言。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款