与 WebSphere MQ 断开连接时测试 WebSphere JMS 应用程序

本文将向您展示如何在无需连接到 WebSphere MQ 队列管理器的情况下,在本地测试运行于 WebSphere Application Server 之上的一个 JMS 应用程序,方法是配置您的本地 WebSphere 测试环境来模拟 WebSphere MQ。这一配置能够让您在开发生命周期的早期识别和解决问题,而无需安装本地队列管理器或等待访问远程队列管理器。

Annette C. Green, 高级 I/T 专家, IBM

Annette Green 担任华盛顿地区 IBM 全球业务服务部的一名高级 I/T 专家。她在企业应用程序设计和开发以及系统集成方面有 15 年的工作经验。Annette 是一名 IBM 认证的 MQ 开发人员、Sun 认证的 Java 编程员以及 MA0J 和 MA92 这两个 WebSphere MQ SupportPac 的创建者。



2012 年 6 月 25 日

免费下载:IBM® WebSphere® Application Server 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

简介

在测试专为 WebSphere Application Server 开发的 JMS 应用程序时,开发团队可能并不总是能够访问 WebSphere MQ 环境。因此,在将应用程序代码部署到一个集成环境中之前,您可能无法识别缺陷并排除故障。本文将向您展示如何配置本地 WebSphere 测试环境,以模拟 WebSphere MQ 队列管理器及其相关队列,这样您就可以在开发生命周期的早期识别和解决问题。

为了模拟类似于 WebSphere MQ 的环境,要利用 WebSphere Application Server V5 默认消息传递提供程序。该提供程序使用本身包含消息传递引擎和相关队列的一个内部服务集成总线 (SIBus)。因此,您要做的不是定义 Java Message Service (JMS) 资源来访问 WebSphere MQ 队列,而是定义 JMS 资源来访问 SIBus 上的队列目标。本文将向您展示如何定义这些资源,并且通过一个样例应用程序来演示如何将消息放置到已定义的队列中,以及如何从已定义的队列中获取消息。

这些操作说明的前提条件是,您的开发环境中已经安装了针对 WebSphere Application Server V6 或其更高版本的本地测试环境。对于 WebSphere Application Server V7 用户,Java Software Development Kit (SDK) 必须至少是 V1.6.0 Java Technology Edition SR9 FP1 for WebSphere Application Server 或 WebSphere Application Server V7 的最新 Java SDK 版本。

样例应用程序

样例应用程序使用下面表 1 中所示的资源。本文逐步指导您定义这些资源中的每一个,向您展示如何为您的特定应用程序定制这些指令。对于样例应用程序,要在 WebSphere Application Server V5 消息传递提供程序下定义两个队列。第一个队列叫做 IncomingQueue,用于应用程序处理的传入消息。第二个队列叫做 OutgoingQueue,它存储样例应用程序发送的消息。这两个队列模拟其相应的 WebSphere MQ 队列,并且需要为每个队列定义相应的 JMS 队列和队列连接工厂 (QCF)。

样例应用程序有一个消息驱动的企业 Java bean (EJB),名为 IncomingMessageReceiverBean。它通过 IncomingListenerPort 侦听器端口侦听消息,并且接收放在 IncomingQueue 队列上的消息。应用程序使用了一个名为 OutgoingMessageSenderBean 的无状态会话 EJB 将消息发送给 OutgoingQueue 队列。

表 1. 样例应用程序使用的资源
WebSphere 队列名JMS 队列JMS QCF侦听器端口EJB 名
IncomingQueuejms/IncomingQueuejms/IncomingQCFIncomingListenerPortIncomingMessageReceiverBean
OutgoingQueuejms/OutgoingQueuejms/OutgoingQCF---OutgoingMessageSenderBean

在为特定应用程序配置本地 WebSphere 测试环境时,可以使用在集成 WebSphere 环境中定义的相同的 Java Naming and Directory Interface (JNDI) 名称。

创建 JMS 队列目标

对于运行于 WebSphere Application Server 之上的任何 JMS 应用程序,常规配置流程包括,为特定消息传递提供程序(比如 WebSphere MQ)定义 JMS 队列。 对于该场景,您要为 WebSphere V5 消息传递提供程序定义队列目标。使用 Rational Application Developer(或一个同等的集成开发环境)启动 WebSphere 测试服务器并执行以下步骤:

  1. 登录到管理控制台,转至 Resources => JMS Providers => V5 default messaging provider (Use Server scope)。
  2. 在 Additional Properties 标题下,单击 WebSphere queue destinationsQueues,具体取决于您的 WebSphere 版本。
  3. 单击 New,为下面表 2 中所示的每个 JMS 资源创建一个新队列目标。注意队列名称,因为稍后在 SIBus 上创建队列时您会使用该名称。
表 2. WebSphere 队列目标值
Queue Name队列 JNDI 名称
IncomingQueuejms/IncomingQueue
OutgoingQueuejms/OutgoingQueue

在为特定应用程序创建 JMS 队列目标时,JNDI 名称应当匹配在 Resources => JMS Providers => WebSphere MQ => WebSphere MQ queue destinations 下的集成环境中定义的名称,其中定义了基本队列名称和相关的队列管理器名称。

  1. 单击 OK 在本地保存更改到主配置。

创建 JMS 队列连接工厂

对于 JMS 应用程序使用的每个 JMS 队列,还需要一个相应的 JMS QCF。在该配置下,需要在 WebSphere V5 默认消息传递提供程序下创建 QCF。在您的测试服务器上执行以下步骤:

  1. 在管理控制台中,转至 Resources => JMS Providers => V5 default messaging
  2. 在 Additional Properties 标题下,单击 WebSphere queue connection factoriesQueue connection factories,具体取决于您的 WebSphere 版本。
  3. 单击 New 为下面表 3 中所示的每个资源创建一个新 QCF:
表 3. WebSphere Queue Connection Factory 值
QCF NameQCF JNDI 名称
IncomingQCFjms/IncomingQCF
OutgoingQCFjms/OutgoingQCF

在为特定应用程序创建 JMS QCF 时,JNDI 名称应当匹配 Resources => JMS Providers => WebSphere MQ => WebSphere MQ queue connection factories 下的集成环境中定义的名称,其中指定了队列管理器和通道细节。

  1. 单击 OK 在本地保存更改到主配置。

定义 JMS 服务器的端口设置

本节将向您展示如何更新与您的本地服务器的 JMS 提供程序相关的设置:

  1. 在管理控制台中,转至 Servers => (WebSphere) Application Servers => <serverName>
  2. 在 Communications 标题下,单击 Ports 链接。注意名为 SIB_MQ_ENDPOINT_ADDRESS 的 MQ 传输端口的端口值。
  3. 单击 New 创建新端口,并从 Well-known 端口字段中选择 JMSSERVER_QUEUED_ADDRESS。在 Host 字段中输入您的测试服务器的主机名,在 Port 字段中输入 SIB_MQ_ENDPOINT_ADDRESS 使用的端口号。
  4. 单击 OK 在本地保存更改到主配置。

创建服务集成总线

服务集成技术已经集成到 WebSphere Application Server 中,用于支持异步消息传递服务。WebSphere Application Server 的默认消息传递提供程序使用该服务集成技术。在这一步中,要定义一个 SIBus,然后将应用程序服务器作为总线成员加入总线,这会促使 WebSphere Application Server 自动为其创建一个消息传递引擎。应用程序服务器使用消息传递引擎来发送和接收消息到总线上的目标。您还可以使用一个现有 SIBus(如果有的话),而非创建一个新的 SIBus。

  1. 在管理控制台中,转至 Service integration => Buses
  2. 单击 New 创建一个新的 SIBus。
  3. 为总线输入一个名称,取消选中 Secure 复选框,然后单击 ApplyFinish
  4. 在新总线的 Topology 标题下,单击 Bus members
  5. 单击 Add 将应用程序服务器添加为一个总线成员。
  6. 选择 Server 单选按钮,选择 <nodeName : serverName>,为数据存储保持 Default 字段。
  7. 单击 Next,然后单击 Finish
  8. 单击 OK 在本地保存更改到主配置。在 Service integration=> Buses => <busName> => Messaging engines 下为您的服务器创建了一个消息传递引擎。

创建内部队列管理器

在前面几步中您配置了样例应用程序使用的 JMS 资源。不过,由于您正在使用 V5 默认消息传递提供程序,所以您还需要在这些 JMS 资源与其在 SIBus 上对应的队列目标创建一个关联。因为 V5 默认消息传递提供程序使用 WebSphere MQ 客户端协议,这一关联称为 WebSphere MQ 客户端链接。它为所有 JMS 应用程序都提供了与 V5 JMS 资源和 SIBus 上的消息传递引擎通信的桥梁,如下面图 1 所示。因此,WebSphere MQ 客户端链接可以充当一个内部队列管理器,并且支持访问 SIBus 上的目标。

图 1. 消息传递引擎与 JMS 应用程序之间的连接
消息传递引擎与 JMS 应用程序之间的连接

按照以下步骤来创建和配置 WebSphere MQ 客户端链接:

  1. 在管理控制台中,转至 Service Integration => Buses => <busName>
  2. 在 Topology 标题下,单击 Messaging Engines
  3. 单击 <nodeName>.<serverName>-<busName> 链接。
  4. 在 Additional Properties 标题下,单击 WebSphere MQ client links
  5. 在接下来的界面中,单击 New 创建一个新的 WebSphere MQ 客户端链接,其值如下面表 4 中所示:
表 4. WebSphere MQ 客户端链接值
字段名称字段值备注
NameDefault.MQClientLink为该字段使用任何值
MQ Channel NameWAS.JMS.SVRCONN为 V5 配置的通道名称
Queue Manager NameWAS_<nodeName>_<serverName>默认情况下最初显示正确的值
Default queue managerChecked
  1. 单击 OK 在本地保存更改到主配置。

在服务集成总线上创建队列目标

对于为 WebSphere V5 消息传递提供程序定义的每个 JMS 队列,您需要在 SIBus 上创建一个相应的目标。本节将向您展示如何在您的 SIBus 上创建一个队列目标,然后将其分配给应用程序服务器总线成员:

  1. 在管理控制台中,转至 Service Integration => Buses => <busName>
  2. 在 Destination Resources 标题下,单击 Destinations
  3. 在接下来的界面上,选择 New 为下面表 5 中的每一行创建一个总线目标。以下步骤会引导您完成每一个界面的设置。
表 5. 队列总线目标值
目标类型标识符总线成员
QueueIncomingQueue<nodeName>:<serverName>
QueueOutgoingQueue<nodeName>:<serverName>
  1. 在 Create new destination 界面中选择队列目标类型。
  2. 在 Set queue attributes 界面中,输入上面表 5 中的队列名称。该值与为 WebSphere V5 消息传递提供程序 JMS 队列使用的值相同(参见上面 表 2)。对于您的特定 JMS 应用程序,WebSphere V5 JMS 队列的名称应当匹配为其相应的总线队列使用的名称。
  3. 在 Assign the queue to a bus member 界面中,选择总线成员名称 <nodeName>:<serverName>。总线成员代表您的应用程序服务器。
  4. 在 Confirmation 界面中,单击 Finish 创建队列。
  5. 创建上面表 5 中的两个队列之后,保存更改到主配置。

在服务集成总线上创建别名目标

接下来您必须为上面创建的每一个队列目标创建一个别名目标。对于样例应用程序,每个别名的字段值在下面表 6 中得到汇总。别名必须使用 WQ_ 前缀。以下步骤引导您完成每一个界面的设置:

表 6. 队列总线目标值
目标类型标识符目标标识符目标总线
AliasWQ_IncomingQueueIncomingQueue<busName>
AliasWQ_OutgoingQueueOutgoingQueue<busName>
  1. 在 Create new destination 界面中,选择别名目标类型。
  2. 在 Set alias destination attributes 界面中,在 Identifier 字段中输入上面表 6 中的别名。每个别名目标的命名规范是在 WQ_ 后面加上队列总线目标名称。请注意,要准确输入别名,不要带多余的空格,因为拼错别名会妨碍整个配置正常工作。
  3. 跳过 Target Identifier 字段。如果 Target Bus 下拉框还没有填充好,那么从 Target Bus 下拉字段中选择您的总线名称。管理控制台界面会自动填充 Target Identifier 字段值。
  4. 从 Target Identifier 字段中选择适当的值,如上面表 6 所规定的。
  5. 为其余字段保留默认值,单击 Next,然后单击 Confirmation 界面上的 Finish
  6. 保存更改到主配置。

完成上述配置之后,会自动为您的 SIBus 的 <nodeName>:<serverName> 消息传递引擎创建队列点。样例应用程序的队列点如下所示:

  • IncomingQueue@<nodeName>:<serverName>-<busName>
  • OutgoingQueue@<nodeName>:<serverName>-<busName>

发送到 JMS 队列的消息会存储在队列点上并加以处理。要查看队列点,转至 Service Integration =>Buses=> <busName> => Messaging Engines=> <nodeName>:<serverName>-<busName> => Queue points

创建 MDB 侦听器端口

对于样例应用程序,要配置的最后一个资源是 IncomingMessageReceiverBean 消息驱动 bean 的侦听器端口。请执行以下步骤:

  1. 在管理控制台中,转至 Servers => Application Servers => <serverName>
  2. 在 Communications 标题下,展开 Messaging 区域并转至 Message Listener Service
  3. 在 Additional Properties 标题下,单击 Listener Ports
  4. 在接下来的界面中,单击 New 创建一个新的侦听器端口。对于样例应用程序,您要使用下面表 7 中所示的值:
表 7. 侦听器端口值
侦听器端口QCF JNDI队列目标 JNDI
IncomingListenerPortjms/IncomingQCFjms/IncomingQueue

对于特定的 JMS 应用程序,如果您在使用消息驱动的 beans,那么侦听器端口名应当匹配与消息驱动的 bean 相关的值,而且 JNDI 值应当匹配为您的应用程序定义的 JMS 资源。

  1. 单击 OK,然后将更改保存到主配置。
  2. 最后重新启动您的测试服务器,确保所有更改生效。

检查服务集成安全性

如果您没有为您的 WebSphere 测试服务器启用全局安全性,那么请跳过这一节,继续下面的 运行样例应用程序。如果已经对您的服务器启用了 全局安全性,那么默认会自动启用总线和消息传递安全性,您应当考虑以下选项:

  • 禁用总线安全性。您仍然可以启用全局安全性,而无需启用总线安全性。
  • 保持启用总线安全性,并执行其他步骤来配置客户端身份验证、身份验证策略和安全传输链。

配置服务集成安全性不在本文讨论范围之内。有关管理服务集成安全性的更多信息,请参阅下面的 参考资料。为您的测试服务器禁用总线安全性的步骤如下:

  1. 在管理控制台中,转至 Service Integration => Buses => <busName>
  2. 如果您的 WebSphere 测试服务器是 V7.0 或其更高版本:
    1. 在 Additional Properties 下,单击 Security
    2. 取消选中 Enable bus security 复选框。
    3. 在 Permitted transports 区域内,选择 Allow the use of all defined transport channel chains
    4. 单击 OK,然后保存更改到主配置。
    5. 重新启动您的服务器。
  3. 如果您的 WebSphere 测试服务器是 V6:
    1. 在 General Properties 下,取消选中 Secure 复选框。
    2. 单击 OK,然后保存更改到主配置。
    3. 重新启动您的服务器。

有关服务集成安全性的更多信息,请参阅下面的 参考资料

运行样例应用程序

样例应用程序允许您将文本消息放在 IncomingQueue 上,并从 OutgoingQueue 获取消息。IncomingMessageReceiverBean 消息驱动的 bean 会自动从 IncomingQueue 上挑选任何消息,并将消息传递给 OutgoingMessageSenderBean 无状态会话 bean。然后 OutgoingMessageSenderBean 将消息放到 OutgoingQueue 中。此时有两个 JSP 被创建,一个用于将消息发送给 IncomingQueue,另一个用于从 OutgoingQueue 中获取消息。要运行应用程序,请执行以下步骤:

  1. 下载本文底部的 JMS 应用程序样例,并将文件解压到一个临时目录中。
  2. 将 SampleJMSApplication.ear 导入一个 Enterprise Application 项目。导入之后,您应当看到图 2 中所示的三个项目,一个 Enterprise Application 项目、一个 EJB 项目,以及一个 Dynamic Web 项目:
    图 2. JMS 应用程序项目样例
    JMS 应用程序项目样例
  3. 启动您的测试服务器并添加 SampleJMSApplication 项目。
  4. 打开一个 Web 浏览器并输入 http://localhost:<portNumber>/SampleJMSApplicationWeb/,
    其中 <portNumber> 是与您的应用程序服务器相关的端口号。
  5. 在 Put Message 界面(参见图 3)中,将任意文本输入到 MessageText 字段中,并单击 Put Message 将消息发送到 IncomingQueue:
    图 3. Put Message 界面
    Put Message 界面
  6. 要获取该消息,请单击 Retrieve message from OutgoingQueue
  7. 在 Get Message 界面(图 4)中,单击 Get Message 从 OutgoingQueue 获取消息:
    图 4. Get Message 界面
    Get Message 界面

结束语

本文向您展示了如何定义模拟 WebSphere MQ 队列的内部 WebSphere V5 队列。您可以使用这些相同的步骤为特定的 JMS 应用程序配置其他队列。一旦完成应用程序的配置,您可以测试 JMS 应用程序,而无需连接到 WebSphere MQ 队列管理器。样例应用程序向您展示了如何使用这一配置将消息发送给模拟的 WebSphere MQ 环境,以及如何从该环境中获取消息。现在您可以建立您自己的本地测试环境来验证您的代码是否正确地处理传入的消息并发送传出的消息。


下载

描述名字大小
本文的 JMS Enterprise Application 样例SampleJMSApplication.zip59 KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=822625
ArticleTitle=与 WebSphere MQ 断开连接时测试 WebSphere JMS 应用程序
publish-date=06252012