级别: 中级 Rachel Reinitz (rreinitz@us.ibm.com), 高级 IT 咨询专家, IBM Andre Tost, 高级技术人员, IBM
2005 年 8 月 17 日 在使用 IBM® WebSphere® Application Server V6 中新的消息传递引擎构建企业服务总线这一系列的第 6 部分中,介绍了 IBM WebSphere V6 Messaging Resources 如何支持使用 IBM WebSphere MQ 进行消息交换。
引言
到目前为止,我们已经在这一文章系列中研究了 WebSphere V6 Messaging Resources 的基础知识、如何建立企业服务总线 (ESB)、如何将 JMS 用作跨总线的消息协议、如何开发和安装简单中介,以及如何通过总线路由从客户机到 SOAP 提供者的 SOAP 请求。我们的总体解决方案已在下列文章中得到了发展:
现在,在第 6 部分中,我们将在 IBM WebSphere MQ 和 WebSphere V6 Message Resources 之间配置和测试发送的消息。
将 SIBus 连接到 MQ 的概念
不管 IBM WebSphere MQ 队列管理器是远程的还是与 IBM WebSphere Application Server V6 共存于同一台计算机上,都可将其配置为使用 WebSphere V6 Message Resources(也称为系统集成总线 (Systems Integration Bus) 或 SIBus)交换消息。由于 WebSphere MQ 和 WebSphere SIBus 不共享任何模块或配置数据,因此对每一方进行配置都必须使用另一方的信息。
SIBus 的核心组件是消息传递引擎 (ME),它是与应用程序进行对话的 SIBus 组件。必须为每个总线至少定义一个 ME。ME 与已添加到总线作为总线成员的特定服务器或服务器集群相关联。可以以多种方式将总线配置为跨多个服务器(即,它可以具有多个总线成员),但是在特定的总线中每个服务器始终至少有一个消息传递引擎。在我们的简单设置中,我们有一个总线,带有一个成员和一个消息传递引擎。这样做非常重要,其原因在于,当我们将 MQ 连接到总线时,该操作是通过消息传递引擎组件完成的。
图 1. 消息传递引擎
我们将使用的其他 SIBus 组件如下:
-
外部总线是位于当前 SIBus 的外部的总线;它可以是另一个 SIBus 或 MQ 队列管理器。
-
外部目的地是一种设计用来将消息发送到外部总线的目的地。
常规的队列目的地可配置为从外部总线接收消息。
MQ 队列管理器对于 SIBus 好像是一个外部总线。消息传递引擎对于 WebSphere
MQ 好像是另一个队列管理器。在 SIBus 端,ME 和队列管理器之间的连接是通过 SIBus 的 MQLink 组件建立的。MQLink 在 MQ 和 SIBus 使用的格式和协议之间进行转换。一个特定的 MQ 队列管理器仅有一个 SIBus MQLink。在 MQ 端,MQ 通道定义为与特定的 SIBus 消息传递引擎进行通信。
有关这些总线组件的详细信息,请参见 WebSphere Application Server V6 Information Center。
图 2. SIBus 组件
在 SIBus 和 WebSphere MQ 之间发送消息
为了使您能概括地了解这一部分所涉及的内容,下面总结了在 SIBus (TheBus) 和 WebSphere MQ 之间传递消息的主要任务。我们将在随后部分中对每一组任务进行详细介绍。
连接 SIBus 和 MQ 队列管理器
-
在 WebSphere Application Server 中创建指向 MQ 队列管理器的外部总线。
-
在 WebSphere Application Server 中创建从 TheBus 到 MQ 队列管理器的 MQ 链接。
-
在 WebSphere MQ 中创建链接到 TheBus 的传输队列(好像另一个 MQ 队列管理器)。
-
在 WebSphere MQ 中定义发送方和接收方通道。
WebSphere Application Server 和 WebSphere MQ 中的这些定义使用公共的 TCP/IP 主机名和端口建立通信。
将消息从 SIBusTo 发送到 WebSphere MQ
-
在 WebSphere Application Server 中创建指向 MQ 队列的外部目的地。
-
将消息发送到外部目的地。对于我们的测试,我们将使用第 3 部分的 JMS 客户机将消息发送到一个目的地,然后再转发到外部目的地。
-
消息是通过总线发送到 MQ 队列的。我们将使用 rfhutil 实用工具来查看 MQ 队列上的消息。
将消息从 WebSphere MQ 发送到 SIBus
-
在 WebSphere Application Server 中创建队列目的地。
-
在 WebSphere MQ 中,创建引用 TheBus 上的目的地的远程队列。
-
使用 rfhutil 或另一个程序将消息放入 MQ 远程队列中。
-
通过 WebSphere MQ 将消息发送到总线上的目的地。对于我们的测试,我们将使用记录中介查看消息是否已传递到目的地。
配置 SIBus 以与 WebSphere MQ 进行通信
在 SIBus 中,我们将创建外部总线和 MQ 链接以与 WebSphere MQ 进行通信。
创建外部总线
-
打开 WebSphere Application Server 管理控制台(服务器必须在运行)。
-
在左侧的导航窗格中,选择 Service Integration => Buses。
-
选择 TheBus。
-
在下一个窗口中,选择 Foreign Buses (图 3)。
图 3. 总线属性
-
选择 New。
-
步骤 1:外部总线属性。提供了一个名称(是用于 SIBus 中的外部总线的标识符):TheForeignBus(图 4)。
图 4. 步骤 1:外部总线属性
-
步骤 2:路由定义类型。对于路由定义类型,请选择 Direct, WebSphere MQ link(图 5)。
图 5. 步骤 2:路由定义类型
-
由于步骤 3 对用户 ID 没有要求,因此选择 Next。
-
分别单击 Finish 和 Save。
-
现在您将在 TheBus 的外部总线列表中看到 TheForeignBus(图 6)。
图 6. 外部总线列表
创建 WebSphere MQ 链接
接下来,我们需要设置从 SIBus 到 WebSphere MQ 的链接,包括将 SIBus 标识为 WebSphere MQ 的队列管理器。然后,我们需要配置与队列管理器中的通道相匹配的的发送和接收通道。
-
在管理控制台左侧的导航窗格中,选择 Service Integration => Buses => TheBus。
-
在下一个窗格中,选择 Messaging engines(图 7)。
图 7. 总线属性
-
选择 Node1.server1-TheBus。
-
在下一个面板的右侧,选择 WebSphere MQ links(图 8)。
图 8. 消息传递引擎配置
-
选择 New。
-
步骤 1:通用 WebSphere MQ 链接属性。输入或选择下列值(图 9):
- Name(仅用于 SIBus):
LocalMQLink
- Foreign bus name:TheForeignBus(它是我们在上一步中创建的,将可能是仅有的一个外部总线名称)
- Queue manager name:
QM_TheBus(通过此名称——而非 MQ 队列管理器的名称——您希望消息传递引擎为 MQ 队列管理器所知)
选择 Next。
图 9. 通用 WebSphere MQ 链接属性
-
步骤 2:发送方通道 WebSphere MQ 链接属性。发送方通道和接收方通道成对地起作用。该通道将成为用于将消息从总线发送到 WebSphere MQ 的连接。它需要与队列管理器所使用的名称、主机名和端口相匹配,以接收来自总线的消息。缺省情况下,队列管理器使用端口 1414 接收传入的消息。输入或选择下列值(图 10):
- Sender MQ channel name:
busToMQ(这可以是任意选择的名称,但它必须与 MQ 队列管理器中的接收方通道名称相匹配。)
- Host name(属于队列管理器):
localhost
- Port(显示队列管理器的缺省端口):
1414
- Transport chain:OutboundBasicMQLink
选择 Next。
图 10. 步骤 2:发送方通道 WebSphere MQ 链接属性
-
步骤 3:接收方通道 WebSphere MQ 链接属性。该通道将成为用于从 WebSphere MQ 到总线接收消息的连接。它必须与队列管理器所使用的名称、主机名和端口相匹配,以将消息发送到总线。缺省情况下,SIBus 使用用于嵌入消息传递的端口 5558 (通用 WebSphere 设置的一部分)接收传入的消息。输入或选择下列值(图 11):
- Receiver MQ channel name:
MQToBus(这可以是任意选择的名称,但它必须与队列管理器中的发送方通道名称相匹配。)
- 不需要定义主机名和端口,因为 WebSphere 嵌入消息传递配置用于接收消息;即,缺省情况下,它使用应用程序服务器的主机名和端口 5558。
- 选择 Next。
图 11. 步骤 3:接收方通道 WebSphere MQ 链接属性
-
步骤 4:WebSphere MQ 链接属性小结。完成并保存更改。
-
重新启动服务器以使新的链接在外部可用。

 |

|
配置队列管理器以与 SIBus 进行通信
 | | WebSphere MQ 的示例屏幕快照来自 Windows® 平台。虽然面板的外观将随平台的变化而有所变化,但所输入的信息将是相同的。 |
|
从本质上而言,配置 MQ 队列管理器以与 SIBus 进行通信的过程,与配置两个 MQ 队列管理器以进行相互通信的过程相同。如果执行 WebSphere MQ 的缺省安装,那么您就具有名为 QM_machine 的队列管理器;这是我们将使用的队列管理器。在我们的示例中,我们将使用名为 QM_reinitz 的队列管理器。
- 打开 WebSphere MQ Explorer,导航到 Start menu => Programs => IBM WebSphere MQ => WebSphere MQ Explorer。
创建传输队列
创建传输队列,以提供带有指向 SIBus 的链接的 QM_reinitz 队列管理器作为队列管理器。
-
展开 WebSphere MQ => QM_reinitz。
图 12. 创建新队列
-
右键单击 Queues,然后选择 New => Local Queue。
-
在 Local Queue 对话框中(图 13),选择 General 选项卡。
-
输入或选择以下值:
- Queue Name:QM_TheBus(必须是在 MQ 链接定义中使用的队列管理器名称)
- Usage:Transmission
选择 OK。
图 13. 创建 Local Queue 对话框
现在,您可以在队列的列表下看到 QM_TheBus(图 14)。
图 14. 队列列表
定义发送方通道
-
展开 QM_reinitz => Advanced。
-
右键单击 Channels,然后选择 New => Sender channel。
-
在 Create Sender Channel 对话框中,选择 General 选项卡(图 15)
-
输入或选择下列值:
- Channel Name:
MQToBus(该名称必须是在定义 MQ 链接上的接收方队列时所使用的正确名称)
- Transmission Protocol:TCP/IP
- Connection Name:运行 SIBus(端口)的计算机的主机名。对于缺省的独立的 WebSphere Application Server 安装,该值为 localhost(5558)。
- Transmission Queue:QM_TheBus。
选择 OK。
图 15. 创建 Sender Channel 对话框
-
展开 Explorer 通道窗口以显示 MQToBus 通道的状态;它最有可能是不活动状态。右键单击新创建的 MQToBus 通道,然后选择 Start。
-
大约一分钟后,从上下文菜单中选择 Refresh。您应该看到状态更改为 Running(图 16)。
图 16. 检查通道状态
定义接收方通道
-
右键单击 Channels,然后选择 New => Receiver Channel。
-
在 Create Receiver Channel 对话框中,选择 General 选项卡(图 17)。
-
输入或选择以下值:
- Channel Name:
busToMQ(该名称必须是在定义 MQ 链接上的发送方队列时所使用的正确名称)
- Transmission Protocol:TCP/IP
对于接收,不需要连接名称和传输队列;缺省情况下使用连接名称和传输队列。
图 17. 创建 Receiver Channel 对话框
不需要启动接收方通道 busToMQ;当将请求接收到接收方通道时,会自动启动它。您将看到定义在 WebSphere MQ 中的两个通道,如图 18 所示。
图 18. WebSphere MQ 队列
现在,我们已经完成了将 TheBus 连接到 WebSphere MQ 的步骤。接下来,我们将逐步研究如何将消息从 WebSphere MQ 发送到 SIBus。
消息传递测试实用工具
 | | 当将消息从 WebSphere MQ 发送到总线时,消息的格式是一个字节数组。我们的记录中介(第 4 部分)将记录 JMS:Text 消息。我们已经将代码添加到该中介以处理字节数组。本文的下载文件中包括的 LoggingMediationRevised 文件提供了此代码。 |
|
可以采用几种方式将消息放入 WebSphere MQ 并从中读取消息以进行测试。我们特别喜欢的一种方式是将前面提到的免费实用工具 rfhutil 用作 WebSphere MQ 支持包。可以从 IBM Software Support 页面下载这一工具。只需解压缩下载的 ZIP 文件并运行 rfhutil.exe 即可。在本文的所有剩余部分中,我们将使用此实用工具来查看和删除队列中的消息,并且将消息放入 WebSphere MQ 队列。由于我们需要查看目的地在测试的过程中接收到的消息,因此我们将把记录中介(请参见侧栏)分配给需要监视的目的地。
将消息从 SIBus 发送到 WebSphere MQ
在这一文章系列的第 3 部分中,我们实现了一个简单的 JMS 客户机将包传递确认消息发送到目的地。由消息驱动的 Bean (MDB) 读取此消息,然后对此消息进行处理。作为 Posts-R-Us ESB 策略的一部分,企业现在正在改变将传输确认传递到其 CICS 后端系统的方式:它们将不使用在生产系统中对 CICS 进行 JCA 调用的 MDB,而是使用用于与 CICS 进行来回通信的 WebSphere MQ。
我们将修改第 3 部分的配置,以便它现在将消息转发到 WebSphere MQ。
-
如果您已经具有第 3 部分中 JMS 示例的设置,那么需要禁用 MDB 以阻止读取发送到总线的消息。可以通过更改 MDB 的 activationSpec,或停止 EAR 文件来完成这一操作。如果不具有 JMS 设置,则遵循第 3 部分中的步骤 1 到步骤 12 设置目的地;由于我们不准备使用 MDB,因此不需要 activationSpec。对于要将消息发送到目的地的 JMS 客户机而言,您的设置需要包含 PackageReceivedDestination 和 JMS 实体。
-
(可选)为了最大化进程的可见性,并有助于调试,请遵循第 4 部分中的指导安装 LoggingMediationRevised(而非 LoggingMediation),并将 LoggingMediationRevised 分配给 PackageReceivedDestination。
-
(可选)遵循任何一篇文章(第 3 部分或第 4 部分)中的指导,使 JMS 客户机将消息发送到目的地,并确认是否在 SystemOut.log 中记录了此消息。
在 WebSphere MQ 中创建队列以接收来自总线的消息
我们需要在 WebSphere MQ 中创建队列来接收来自总线的消息。在生产环境中,后端系统接着将读取此队列的消息。在我们的测试环境中,我们将使用 rfhutil 实用工具读取消息。
-
在 WebSphere MQ Explorer 中,导航到 WebSphere MQ => QM_reinitz => Queues。
-
右键单击 Queues,然后选择 New => Local Queue。
-
在 Create Local Queue 对话框中,选择 General 选项卡(图 19)。
-
对于 Queue Name,输入 DeliveryConfirmationQueue,然后选择 OK。
图 19. 创建 Local Queue 对话框
您应该看到下列队列目的地:
图 20. 队列目的地
创建外部目的地以将消息从总线发送到 WebSphere MQ
在总线中,我们需要创建外部目的地,它在 WebSphere MQ 中是一个虚拟地址。因为外部目的地在 WebSphere MQ 中表示一个端点,所以不能对其附加中介。
-
在 WebSphere Application Server 管理控制台中,选择 Buses => TheBus => Destinations。
-
选择 New。
-
选择 Foreign。
-
选择 Next。
-
步骤 1:设置外部目的地属性。输入或选择下列值(图 21):
- Identifier:
DeliveryConfirmationQueue@QM_reinitz(WebSphere MQ 中的队列)
- Bus:TheForeignBus(消息所发送到的总线)
选择 Next。
图 21. 步骤 1:设置外部目的地属性
-
步骤 2:确认外部目的地的创建。选择 Finish,然后选择 Save。您应该具有如图 22 所示的目的地。
图 22. 目的地列表
完成路由和测试
现在,我们需要从第 3 部分中的目的地(JMS 客户机调用此目的地)和我们刚才创建的外部目的地进行路由。
-
从目的地列表(图 22)中选择 PackageReceivedDestination。
-
设置 Default 将路由路径转发到 TheForeignBus: DeliveryConfirmationQueue@QM_reinitz。
-
分别选择 OK 和 Save。
-
重新启动服务器。现在,我们准备测试从 JMS 客户机到 WebSphere MQ 的消息传递。
-
运行命令提示符中的 JMS 客户机:
launchclient packagedReceivedClient.ear
-
(可选)检查 SystemOut.log 文件以从 PackageReceivedDestination 上的记录中介输出。
-
运行 rfhutil.exe。
-
选择队列管理器 QM_reinitz。
-
选择队列 DeliveryConfirmationQueue。
-
选择 Read Q。
-
您应该看到如图 23 所示的队列上的消息。
图 23. 传递确认
您也可以检查 SystemOut.log 文件来查看 PackageReceivedDestination 上的记录中介的输出:
SystemOut O Message logged. The payload of the message is Package Received - 24595023 |
将消息从 WebSphere MQ 发送到 SIBus
在本系列的第 5 部分中,我们创建了一个包(跟踪在 ESB 上可用的 Web 服务)来支持各种要求跟踪数据的包的客户机应用程序。所需的一种访问是通过 WebSphere MQ。在本示例中,发出请求的系统不支持 SOAP,因此,它将通过 WebSphere MQ 将 SOAP 消息的 XML 主体发送到总线。(在本系列以后的文章中,我们将介绍如何将这种 XML 消息转换为 SOAP 消息。)目前,我们将重点放在从总线上的 WebSphere MQ 获取消息。
创建总线目的地以从 WebSphere MQ 接收消息
我们需要创建总线目的地来接收放在 WebSphere MQ 中的远程队列中的消息。该目的地将成为常规队列目的地。
-
从 WebSphere 管理控制台中,选择 Buses => TheBus => Destinations。
-
选择 New。
-
选择 Queue。
-
选择 Next。
-
步骤 1:设置队列属性。对于 Identifier,选择 PackageTrackingFromMqDestination,然后选择 Next。
-
步骤 2:将队列分配给总线成员。选择 node1:server1,然后选择 Next。
-
步骤 3:确认队列的创建。选择 Finish。
-
要知道消息是否到达总线上的目的地,请遵循第 4 部分中的指导安装 LoggingMediationRevised(而非 LoggingMediation),然后将其分配给 PackageTrackingFromMqDestination。
-
保存。
您应该具有图 24 中所列出的目的地。(如果在同一台服务器上具有第 3 部分或第 5 部分中的设置,那么将会看到所列出的其他目的地。)
图 24. 目的地列表
创建远程队列以将消息从 WebSphere MQ 发送到总线
-
在 WebSphere MQ Explorer 中,展开 WebSphere MQ => QM_reinitz => Queues。
-
右键单击 Queues,然后选择 New => Remote Queue Definition。
-
在 Create Remote Queue Definition 对话框中,选择 General 选项卡(图 25)。
-
输入或选择下列值:
- Queue Name(本地 WMQ Queue Manager):
PackageTrackingRequestRemoteQueue
- Remote Queue Name(WebSphere Application Server 中的队列目的地):
PackageTrackingFromMqDestination
- Remote Queue Manager Name:
QM_TheBus(WebSphere MQ 将总线称为此名称;当创建 MQ 链接时指定此名称)
- Transmission Queue Name:QM_TheBus(在创建发送方通道以便将消息从 MQ 发送到总线时,您创建了一个传输队列;这里,传输队列的名称恰好与远程队列管理器的名称相同。)
选择 OK。
图 25. Create Remote Queue Definition 对话框
创建队列之后,将看到图 26 所示的列表。
图 26. 队列列表
使用远程队列测试将消息从 WebSphere MQ 发送到总线
 | | 当测试将消息发送到 SIBus 时,您可能需要采用一种方式删除总线中的消息。导航到 Buses => TheBus => Destinations => PackageTrackingFromMqDestination => Queue Points => node1.server1-TheBus => Messages。您可以看到发送到目的地的消息的详细情况,您还可以删除单个或所有消息。这是使用 LoggingMediationRevised 查看从 WebSphere MQ 发送的消息的一种可供选择的方式。 |
|
我们的示例应用程序(包含请求特定 trackingNumber 的包状态所需的代码)包含了 XML 文件。我们将使用文件 track123.xml 来测试将消息从 WebSphere MQ 发送到总线目的地。
请记住:WebSphere MQ 中的 MQToBus 通道必须在运行。如果重新启动计算机、WebSphere MQ 或 WebSphere Application Server,就可能得重新启动通道。因此通道应该处于运行状态。
要将消息放入远程 WebSphere MQ 队列 PackageTrackingRequestRemoteQueue 中,我们将使用 rfhutil:
-
运行 rfhutil.exe。
-
选择 Main 选项卡(图 27)。
图 27. 运行 rfhutil 实用工具,Main 选项卡
-
输入或选择下列值:
- Queue Manager Name:QM_reinitz
- Queue Name:PackageTrackingRequestRemoteQueue
选择 Read File 以加载 track123.xml 的内容。
-
要查看文件的内容,请选择 Data 选项卡(图 28),然后选择 XML 作为数据格式。
图 28. 运行 rfhutil 实用工具,数据选项卡
-
返回到“Main”选项卡(图 27),然后选择 Write Q。
-
在 WebSphere Application Server Systemout.log 文件中,您应该看到来自 LoggingMediationRevised 中介的输出:
SystemOut O Message logged. The payload of the message is <?xml version="1.0" encoding="UTF-8"?>
<p843:getPackageStatus xmlns:p843="http://service.postrus">
<trackingNumber>123</trackingNumber>
</p843:getPackageStatus>
|
结束语
在这一文章系列的第 6 部分中,我们描述了 WebSphere Application Server V6 Message Resources 中对使用 WebSphere MQ 交换消息的支持。我们一步一步演示了如何设置 SIBus 和 WebSphere MQ 之间的连接性、如何测试将消息从 MQ 发送到 SIBus,以及如何测试将消息从 SIBus 发送到 MQ。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Code sample | esb_part6_code.zip | 5 KB |
FTP | HTTP |
|---|
参考资料
作者简介  | 
|  | Rachel Reinitz 是 IBM Software Services for WebSphere 中重点研究 Web 服务的高级 IT 咨询专家。Rachel 为客户和独立软件供应商提供咨询,向其讲解如何使用面向服务的体系结构和 Web 服务来实现他们的业务以及技术目标。她开发了 IBM 高级 Web 服务培训课程,并且经常出席会议。Rachel 同时也是一名经验丰富的极限编程指导,她有四年 XP 实践经历。她居住在加利福尼亚州的 Bay 区,喜爱徒步旅行、社交活动以及国际旅行。 |
 | 
|  |
Andre Tost 是 Software Group 的 Enterprise Integration Solutions 组织的一名高级技术人员,他在这个部门帮助 IBM 的客户建立面向服务的体系结构。他专长于 Web 服务技术。在开始从事目前的工作之前,他有十年的时间在 IBM 软件开发工作中担任各种合作伙伴启动、开发和构架设计方面的角色,目前他在 WebSphere Business Development 小组工作。他出生于德国,目前在美国明尼苏达州的罗彻斯特居住和工作。在业余时间,他喜欢和家人在一起,并且有空就去踢球或看球赛。 |
对本文的评价
|