|
Bobby Woolf
WebSphere J2EE Consultant, IBM Software Services for WebSphere
2005 年 6 月
配置 IBM® WebSphere® Application Server V6 以将 IBM WebSphere MQ V5.3 作为它的 Java™ Message Service (JMS) 提供程序使用。
引言
许多组织开始依靠 IBM WebSphere MQ 来进行企业消息传递,并依靠 IBM WebSphere Application Server 来部署他们的 Java 2 Platform Enterprise Edition (J2EE™) 应用程序。很自然地,这些组织希望能够同时使用这两个产品,并将 WebSphere MQ 作为部署在 WebSphere Application Server 中的 J2EE 应用程序的 Java Message Service (JMS) 提供程序使用。
本文演示了如何配置 WebSphere Application Server V6 以将 WebSphere MQ V5.3 作为它的 JMS 提供程序使用,从而帮助实现这个愿望。我们假定在同一台服务器上(它是首选的拓扑)安装了 WebSphere Application Server 和 WebSphere MQ,并包含一个简单的 J2EE 应用程序来演示和测试点到点和发布/订阅这两个域的 JMS 消息传递。
本文使用的应用程序代码可以很容易地使用 IBM Rational® Application Developer for WebSphere Software V6(下面简称为 Application Developer)来检查和测试。另外,还可以使用 WebSphere Application Server Toolkit (ASTK) 来执行这里描述的任务。文中所给出的示例是使用 Microsoft® Windows® XP 上的产品来显示的。
检查示例代码
在介绍如何配置服务器之前,我们先看一下使用了本文所描述的配置的示例代码(下载本文后面的示例应用程序)。
我们的示例应用程序 JMSExample 不是一个完整的应用程序,而是几个简单的 Enterprise JavaBean (EJB) 组件,它们演示了如何使用 JMS 来发送和接收消息。完整的应用程序将使用这样的类来让应用程序能够使用消息传递。为了理解该示例的工作方式,我们将检查这些类及其部署描述符。检查这段代码的一种简单方式是将 EAR 文件导入 Application Developer(请参阅 Deploying message-driven beans and JMS applications into the Service Integration Bus)。
检查类
JMSExample 中的类实现了下面的图 1 所列出的 EJB 组件。
图 1. 示例类中的 EJB

| EJB |
描述 |
| MessageProducerSSBBean |
创建和发送消息的无状态会话 Bean。将这段代码封装在一个 EJB 中可以使该代码拥有自己的环境引用来访问 JMS 资源。在完整的应用程序中,将消息传递代码封装在一个 EJB 组件中可以使该 EJB 容器能够管理消息传递提供程序和其他事务性资源(如数据库)之间的事务。
该 Bean 有两个公共方法:sendMessage(String) 和 publishMessage(String),它们分别用于向示例的队列或主题添加包含某些文本的消息。由于 JMS 1.1 将点到点和发布/订阅消息传递域统一起来,因此为了避免重复代码,这两个方法只需调用第三个方法——私有方法 produceMessage(String, String, String)——来完成创建消息和将消息添加到队列或主题的所有工作。
|
| ReceiverMDBBean |
一个消息驱动 Bean (MDB),配置为侦听示例队列中的所有消息。当接收到一个消息时,它会将输出打印到 System.out 来显示消息内容。 |
| SubscriberNDMDBBean |
一个 MDB,配置为非持久订户,用于侦听示例主题中的消息。与 ReceiverMDBBean 一样,这个 Bean 也显示它接收到的消息内容。 |
| SubscriberDMDBBean |
一个 MDB,和 SubscriberNDMDBBean 一样侦听相同的主题,但作为持久订户。因为我们有两个 Bean 类与该主题相关联,所以有两个 Bean 池(两组 MDB 实例),每个 Bean 池都将接收任何已发布的消息,表明主题确实将每个消息广播给所有订户。 |
检查部署描述符
EJB 组件是在具有环境引用的 EJB 部署描述符中配置的,它使得 EJB 可以通过它们的 Java Naming and Directory Interface (JNDI) 名称访问服务器资源。这些引用(如下所示)可以在 EJB Deployment Descriptor 编辑器(图 2)中看到。
图 2. EJB Deployment Descriptor 编辑器

| EJB |
环境引用 |
| MessageProducerSSBBean |
由于定义了以下三个环境引用,使得它可以访问发送消息时需要的 JMS 提供程序资源:
- jms/JMSExampleConnectionFactoryRef——用关键字 jms/JMSExampleConnectionFactory 来引用 JNDI 目录中绑定的 JMS ConnectionFactory。
- jms/JMSExampleQueueRef——用关键字 jms/JMSExampleQueue 来引用 JNDI 目录中绑定的 JMS Queue。
- jms/JMSExampleTopicRef——用关键字 jms/JMSExampleTopic 来引用 JNDI 目录中绑定的 JMS Topic。
|
| ReceiverMDBBean |
目的地类型 = "Queue" 侦听器端口 = "JMSExampleQueuePort" |
| SubscriberNDMDBBean |
目的地类型 = "Topic" 订户持久性 = "NonDurable" 侦听器端口 = "JMSExampleTopicPort" |
| SubscriberDMDBBean |
目的地类型 = "Topic" 订户持久性 = "Durable" 侦听器端口 = "JMSExampleTopicPort"
这两个订户池将共享相同的侦听器端口。 |
MDB 对资源的引用 MDB 类不需要定义引用,因为 MDB 不需要用户代码来接收消息。然而,如果 MDB 的用户代码也发送消息,例如当 MDB 接收到请求或访问其他资源(如存储消息内容的数据库)时发送回应消息,则 MDB 就需要引用,以便通过 JNDI 来定位这些资源。
那么,MDB 如何知道从哪个目的地接收消息呢?EJB 规范要求每个 MDB 都必须与它要侦听的目的地或端点相关联——但该规范没有规定如何进行这样的关联。WebSphere Application Server(版本 5 和 6)都在 WebSphere MQ 提供程序中使用侦听器端口将 MDB 类与 JMS 目的地相关联。
J2EE 1.4 支持使用 J2EE Connector Architecture (J2C) 的 JMS API 实现。具有这个实现的 JMS 提供程序(例如 WebSphere Application Server V6 中的 Default Messaging 提供程序)使用激活规范来将 MDB 与它的 JMS 目的地相关联。然而,WebSphere MQ V5.3 中的 JMS 实现不是使用连接器体系结构构建的,所以改用侦听器端口来实现关联,与 WebSphere Application Server V5 中一样。 |
配置 WebSphere MQ
既然我们熟悉了 JMS 示例应用程序,就可以安装 WebSphere MQ,以便 WebSphere Application Server 能够把它作为 JMS 提供程序。
要在 WebSphere Application Server 中使用 WebSphere MQ 提供程序,必须安装 WebSphere MQ。我们假定在同一台服务器上安装了 WebSphere Application Server 和 MQ,并且应用程序将使用绑定传输模式来进行连接。我们作出这样的假定有两个原因:
- 简单
在应用服务器上本地安装 WebSphere MQ 使得示例更加简单。这允许 WebSphere Application Server 使用绑定传输模式连接到 WebSphere MQ,而不必使用客户机连接模式,前者使用 Java Native Interface (JNI) 库来直接连接到 MQ 队列管理器,而后者是通过 TCP/IP 网络连接来建立连接的。
- 实用
一般来说,使用客户机模式访问 WebSphere MQ 是不得已才为之的。通常消息传递应用程序(在本例中是一个在 WebSphere Application Server 中运行的 J2EE 应用程序)与 WebSphere MQ 不在同一台计算机上运行,所以应用程序必须使用同步的、可靠性较差的 TCP/IP 网络连接来连接到它的异步的、可靠性很高的消息传递系统上。然而,WebSphere Application Server V6 包括 Service Integration Bus 和 WebSphere MQ 链接;可以将这二者结合使用以作为连接到 WebSphere MQ 的桥梁,从而提供一个比使用客户机模式质量更高的方法。因此,请在绑定模式下使用 WebSphere MQ,或者使用 WebSphere MQ 链接,而不要使用客户机模式。
创建队列管理器和队列
在 WebSphere MQ Explorer(图 3)中:
- 导航到 Queue Managers 文件夹。
- 以缺省设置新建一个名为
QMGR 的队列管理器。(按照惯例,TCP/IP 侦听器端口的端口号应该为 1414,但由于我们使用绑定传输模式,所以该端口是可选的。)当 WebSphere Application Server 将应用程序连接到 WebSphere MQ 时,它会将该应用程序连接到此队列管理器。
- 导航到 QMGR 的 Queues 文件夹。
- 以缺省设置新建一个名为
EXAMPLE.QUEUE 的本地队列。应用程序将使用该队列来执行点到点消息传递。
图 3. 新队列管理器和本地队列

为发布/订阅配置 WebSphere MQ
WebSphere MQ V5.3 不包含对发布/订阅消息传递的支持,但您可以通过安装 MA0C SupportPac: WebSphere MQ (MQSeries) Publish/Subscribe 来添加这种支持,我们假定您将使用这个支持包。最近的 WebSphere MQ 修复包(以 CSD08 打头)包含该 MA0C SupportPac。(运行 mqver 查看 WebSphere MQ 的版本号。)如果安装没有包含 SupportPac,则可以将它添加进来(请参阅参考资料以找到它的下载位置。)如果您使用独立的发布/订阅产品,例如 WebSphere Business Integration Event Broker 或 Message Broker,则本文显示的一些 WebSphere Application Server 配置设置将有所不同。
在安装 MA0C SupportPac 之后,需要配置并启动它:
- 定义 JMS 发布/订阅管理队列:
C:\WebSphere MQ\bin> runmqsc QMGR < ..\Java\bin\MQJMS_PSQ.mqsc
|
- 启动代理并确认它正在运行:
C:\WebSphere MQ\bin> strmqbrk -m QMGR
MQSeries Publish/Subscribe broker started for queue manager QMGR.
C:\WebSphere MQ\bin> dspmqbrk -m QMGR
MQSeries Publish/Subscribe broker for queue manager QMGR running.
|
我们已经安装好 MA0C SupportPac,定义了管理队列,并启动了代理。现在 WebSphere MQ 可以用于发布/订阅功能了,它为应用程序用来执行发布/订阅消息传递的主题实现代理。
配置应用服务器
要配置 WebSphere Application Server 以将 WebSphere MQ 作为其 JMS 提供程序使用,需要执行这些常规步骤:
- 启动应用服务器
- 查看 WebSphere MQ 消息传递提供程序面板
- 定义 JMS 连接工厂
- 定义 JMS 队列
- 定义 JMS 主题
- 定义侦听器端口
1. 启动应用服务器
- 如果您使用 Application Developer 来启动 WebSphere Application Server,请切换到 Servers 视图,选择该服务器,并按 Start 按钮。(图 4)
图 4. 启动服务器

要从 OS 命令行启动 WebSphere Application Server,请运行 startServer 脚本(假定您使用缺省概要来创建服务器,并且它的名称为 server1):
C:\WebSphere Application Server\bin> startServer server1
|
服务器成功启动后,您将会在 Console 视图或 SystemOut.log 文件(位于 <was_home>\profiles\server1\logs 目录中)中看到这条消息:
WSVR0001I: Server server1 open for e-business
|
如果您使用的是 Rational Application Developer,则 Servers 视图将显示服务器的状态为 Started。
- 打开管理控制台。在 Application Developer 中,从 Servers 视图选择该服务器,右键单击并选择“Run administrative console”。也可以通过 Web 浏览器打开此 URL 来运行管理控制台(假定服务器是在本地机器中使用缺省端口设置运行的):
http://localhost:9060/ibm/console
|
- 登录到控制台。使用管理控制台来执行以下几节中的步骤,不管您如何启动 WebSphere Application Server,这些步骤都一样。
2. 查看 WebSphere MQ 消息传递提供程序面板
- 在管理控制台中,导航到 Resources => JMS Providers => WebSphere MQ (图 5)以显示主 WebSphere MQ 消息传递提供程序面板(图 6)。
图 5. 导航到 WebSphere MQ

图 6. WebSphere MQ 消息传递提供程序

缺省作用域是 Node,这已经可以了(作用域在这个示例中关系不大,因为我们在一个单元的一个节点中只使用一台服务器;任何作用域都会将配置应用到我们的服务器上)。“General Properties”已为您进行了设置。“Additional Properties”部分中的链接可以让您管理以下 JMS 管理对象:
| 链接标签 |
JMS 类 |
| WebSphere MQ 连接工厂 |
ConnectionFactory |
| WebSphere MQ 队列连接工厂 |
QueueConnectionFactory |
| WebSphere MQ 队列目的地 |
Queue |
| WebSphere MQ 主题连接工厂 |
TopicConnectionFactory |
| WebSphere MQ 主题目的地 |
Topic |
在 WebSphere Application Server 中管理的对象被绑定在 JNDI 中,它允许 J2EE 应用程序中的 JMS 代码访问 WebSphere MQ 中的相关资源。(每个 WebSphere MQ 提供程序对象都有各种设置可供配置,但我们只介绍示例正常工作所需的几个主要设置。有关详细信息,请参阅 WebSphere Application Server V6 System Management and Configuration Handbook 中的 10.6.3 小节“Configuring the WebSphere MQ JMS provider”和 10.6.4 小节“Configuring listener ports”。)
3. 定义 JMS 连接工厂
- 我们需要定义 JMS 连接工厂,我们的代码将用它来与 WebSphere MQ 建立 JMS 连接。在对话框的“Additional Properties”部分(图 6)中,选择 WebSphere MQ connection factories 以显示 WebSphere MQ 连接工厂面板(图 7)。
- 按 New 按钮。在接下来的面板中,输入或选择以下值:
| 字段名称 |
描述 |
值 |
| Name |
任何字符串;按照惯例,我们使用与其 JNDI 叶相同的名称。 |
JMSExampleConnectionFactory |
| JNDI name |
为无状态会话 Bean 定义资源引用的 JNDI 绑定时使用的相同值。 |
jms/JMSExampleConnectionFactory |
| Queue manager |
WebSphere MQ 队列管理器的名称,它实现了队列,而它的 MA0C 代理实现应用程序要使用的主题。 |
QMGR |
| Transport type |
绑定表示 WebSphere MQ 及其队列管理器是本地安装的,与 WebSphere Application Server 位于同一台计算机,因此可以直接访问。另外,传输类型还可以是 Client,它使用 TCP/IP 来远程连接到队列管理器;不过如前面所述,WebSphere Application Server V6 应用程序应该使用 WebSphere MQ 链接而不是 Client 模式来远程访问 WebSphere MQ。 |
Bindings |
| Client ID |
必需的设置,因为该示例包含一个持久订户。JMS 使用主题名称、客户机 ID 和订户名称来唯一标识一个持久订阅。此设置是 JMS 必需的客户机 ID。它可以是任何字符串,但要求对每个(主题)连接工厂是唯一的。 |
client1 |
| Broker version |
Basic 表示我们正在使用 MA0C SupportPac。另一种设置 Advanced 表示我们正在使用独立的发布/订阅产品:WebSphere Business Integration Event Broker 或 Message Broker。 |
Basic |
| Broker message selection |
指示消息传递系统的哪个部分实现消息选择器。(本示例不使用消息选择器,但不管怎么样还得配置该设置。)MA0C 代理只支持在客户机中执行消息选择。 |
Client |
其他所有设置都接受缺省值。具体来说就是几个指定各种代理管理队列的字段。只要您使用 MQJMS_PSQ.mqsc 文件来定义这些队列,这些缺省名称就都将有正确的值,因此您可以在 WebSphere Application Server 中把这些字段保留为空,它会采用缺省名称。
图 7. WebSphere MQ 连接工厂

- 按面板底部的 Apply 提交更改。
4. 定义 JMS 队列
我们需要使用 WebSphere MQ 来定义代码用来执行点对点消息传递的 JMS 队列:
- 在管理控制台中,再次导航到 WebSphere MQ messaging provider 面板。
- 在“Additional Properties”部分,选择 WebSphere MQ queue destinations。
- 在“WebSphere MQ queue destinations”面板中,按 New 按钮。
- 在接下来的面板中,输入或选择以下值:
| 字段名称 |
描述 |
值 |
| Name |
可以是任何字符串;按照惯例,我们使用与其 JNDI 叶相同的名称。 |
JMSExampleQueue |
| JNDI name |
在为无状态会话 Bean 定义环境引用时使用的相同值。 |
jms/JMSExampleQueue |
| Base queue name |
WebSphere MQ 中的队列的名称(与访问该队列的 Java 引用相对)。这与我们前面配置 WebSphere MQ 时使用的队列名称相同。 |
EXAMPLE.QUEUE |
其他所有设置都接受缺省值。具体来说,如果 Base 队列管理器名称保留为空,则其缺省值将为用于连接该队列的连接工厂的队列管理器值。
图 8. WebSphere MQ 队列目的地

- 按 Apply 提交更改。
5. 定义 JMS 主题
我们需要使用 WebSphere MQ 来定义代码用来执行发布/订阅消息传递的 JMS 主题:
- 在管理控制台中,再次导航到 WebSphere MQ messaging provider 面板。
- 在“Additional Properties”部分,选择 WebSphere MQ topic destinations 以显示“WebSphere MQ topic destinations”面板。
- 按 New 按钮。
- 在“New WebSphere MQ topic destinations”面板(图 9)中,输入或选择以下值:
| 字段名称 |
描述 |
值 |
| Name |
可以是任何字符串;按照惯例,我们使用与其 JNDI 叶相同的名称。 |
JMSExampleTopic |
| JNDI name |
在为无状态会话 Bean 定义环境引用时使用的相同值。 |
jms/JMSExampleTopic |
| Base topic name |
WebSphere MQ 的 MA0C 代理中的主题名称。这个名称是任意的,但应该是唯一的和描述性的主题名称。 |
ExampleTopic |
其他所有设置都接受默认值。具体来说就是两个指定持久订阅管理队列的字段。只要我们使用 MQJMS_PSQ.mqsc 文件来定义这些队列,缺省值就应该是正确的,因此在 WebSphere Application Server 中可以将这些字段保留为空,它会采用缺省名称。
图 9. WebSphere MQ 主题目的地

- 按 Apply 提交更改。
6. 定义侦听器端口
我们的示例代码需要两个侦听器端口,必须在服务器中定义它们:
- JMSExampleQueuePort
- JMSExampleTopicPort
- 在管理控制台中,导航到 Servers => Application Servers(图 10)。
图 10. 导航到“Application servers”面板

- 在“Application servers”面板中,单击链接到服务器的 server1(缺省情况下服务器命名为 server1)以显示应用服务器配置面板(图 11)。
图 11. 应用服务器配置面板

- 在“Communications”部分,导航到 Messaging => Message Listener Service,然后选择 Listener Ports。
- 在“Listener Ports”面板中,按 New 按钮。
- 在“New listener port”面板(图 12)中,输入或选择以下值:
| 字段名称 |
描述 |
值 |
| Name |
与在 ReceiverMDBBean 的配置中指定的名称相同。侦听器端口名称可以是任意字符串,但必须与 MDB 配置中的名称匹配。 |
JMSExampleQueuePort |
| Connection factory JNDI name |
与前面定义的连接工厂中的 JNDI Name 字段值相同。 |
jms/JMSExampleConnectionFactory |
| Destination JNDI name |
与前面定义的队列中的 JNDI Name 字段值相同。 |
jms/JMSExampleQueue |
所有其他设置都接受缺省值。很明显,“Initial State of Started”意味着侦听器端口将在服务器启动时启动。
图 12. 新侦听器端口

- 在面板底部,按 Apply 提交更改。
- 再次执行步骤 a 到 f 创建第二个侦听器端口,可以使用以下设置:
| 字段名称 |
值 |
| Name |
JMSExampleTopicPort |
| Connection factory JNDI name |
jms/JMSExampleConnectionFactory |
| Destination JNDI name |
jms/JMSExampleTopic |
- 选择 Save 链接,然后单击 Save 按钮,将更改保存到服务器的配置文件中。
- 退出管理控制台并关闭浏览器。
部署和重启
既然已经配置了服务器,我们就基本可以部署和测试应用程序了。不过首先要重启服务器才能使它使用更改的配置运行。(您可以重启服务器,然后部署应用程序,但之后在重启服务器时将无法在 Console 视图或 SystemOut.log 中看到应用程序启动消息。)
在本小节中,我们将:
- 部署应用程序
- 重启服务器
- 检查启动消息。
7. 部署应用程序
要将我们的 JMSExample 应用程序添加到服务器,请执行下列步骤:
- 如果使用 Rational Application Developer,则:
- 进入“Servers”视图,选择该服务器,然后从弹出菜单中选择 Add and remove projects...。
- 在“Add and Remove Projects”对话框中,将 JMSExample 添加到已配置项目列表中,然后单击 Finish。通过这种方式将企业项目与服务器相关联,重启服务器后,不仅部署到服务器的项目会自动变得可用,而且以后对项目代码进行的更改也会自动变得可用。
图 13. Rational Application Developer 中的“Add and Remove Projects”对话框

- 对于 WebSphere Application Server:
- 打开管理控制台,导航到 Applications => Install New Application。
- 使用“Application Installation”面板来安装 JMSExample.ear 文件。
图 14. WebSphere Application Server 应用程序安装

不管采用哪种方法,在部署应用程序时,除非已经重启服务器,否则将在控制台和 SystemOut.log 文件中报错,表明应用程序不能启动。出错原因是我们所做的配置更改只有在服务器重启后才能生效,所以此时可以忽略这些错误。一旦重启,服务器就会用我们为它配置的资源成功启动应用程序。
8. 重启服务器
需要停止和启动服务器才能使它重新读取更改的配置文件并以新配置运行:
- 在“Rational Application Developer Servers”视图中,右键单击服务器并选择 Restart => Start。另外,还可以单击 Stop 按钮停止服务器,然后单击 Start 按钮让它再次启动。“Servers”视图显示服务器的状态为“Started”。
- 如果您从 OS 命令行运行 WebSphere Application Server,则可以使用这些命令来运行 stopServer 和 startServer 脚本(假定您的服务器为缺省概要并且命名为 server1):
C:\WebSphere Application Server\bin> stopServer server1
C:\WebSphere Application Server\bin> startServer server1
|
一旦重启,您将在控制台或 SystemOut.log 文件中看到这段消息:
WSVR0001I: Server server1 open for e-business
|
9. 检查启动消息
启动服务器后,System.out(控制台或 SystemOut.log 文件中)会打印出大量状态消息。我们来检查一下和我们的示例有关的消息:
- 这些消息显示我们的连接工厂、队列和主题已经绑定到 JNDI 中:
WSVR0049I: Binding JMSExampleConnectionFactory as jms/JMSExampleConnectionFactory
WSVR0049I: Binding JMSExampleQueue as jms/JMSExampleQueue
WSVR0049I: Binding JMSExampleTopic as jms/JMSExampleTopic
|
- 这些消息显示我们的应用程序(包括它的 EJB JAR 文件)已经启动:
WSVR0200I: Starting application: JMSExample
WSVR0207I: Preparing to start EJB jar: JMSExampleEJB.jar
WSVR0037I: Starting EJB jar: JMSExampleEJB.jar
WSVR0221I: Application started: JMSExample
|
- 这些消息显示侦听器端口已经启动(对于每个 MDB 类,该消息都打印一次,所以我们能看到两次关于主题端口的消息。)
WMSG0042I: MDB Listener JMSExampleTopicPort started successfully
for JMSDestination jms/JMSExampleTopic
WMSG0042I: MDB Listener JMSExampleTopicPort started successfully
for JMSDestination jms/JMSExampleTopic
WMSG0042I: MDB Listener JMSExampleQueuePort started successfully
for JMSDestination jms/JMSExampleQueue
|
如果能看到所有这些消息,并且没有看到任何错误或异常堆栈转储(Stack Dump),则服务器和示例应用程序就已经成功启动了。
测试应用程序
到目前为止,我们已经配置了服务器,部署了应用程序,并成功启动了服务器。现在,我们将使用 Universal Test Client (UTC)(Rational Application Developer 中的一个 IBM 工具)、Application Server Toolkit (ASTK) 和 WebSphere Application Server 来测试我们的应用程序。我们将使用 UTC 来运行无状态会话 Bean,然后观察 System.out,看看 MDB 做了什么。
在 Rational Application Developer 中,我们将在服务器上运行 MessageProducerSSBBean,它会在运行于服务器的 Bean 的 Home 接口的实例上打开 UTC。其步骤是:
- 从 Project Explorer 导航到 EJB Projects => JMSExampleEJB => Deployment Descriptor: JMSExampleEJB => Session Beans => MessageProducerSSB。
- 右键单击该 Bean,然后选择 Run => Run on server...(图 15)。
图 15. 运行无状态会话 Bean

- 在“Server Selection”对话框中,选择为这个示例配置的服务器,然后单击 Finish。这将启动服务器(如果它尚未运行的话)并在无状态会话 Bean 的 Home 接口上运行 UTC。
- 切换到“Console”视图,并滚动到底部,这样可以观察到来自 MDB 的输出。
在没有 IDE 的情况下启动 UTC
启动 Universal Test Client 的最简单方式是使用 Rational Application Developer 或 Application Server Toolkit (ASTK) 在服务器上运行 EJB。然而,如果从命令行启动 WebSphere Application Server 并且只想在 Web 浏览器中运行 UTC,则也可以这样做,这样需要做更多的工作。
该 UTC 是一个 J2EE 应用程序,称为 IBMUTC。如果应用程序已经运行,则在 Web 浏览器中通过此 URL 打开 UTC(假定服务器已经使用缺省端口设置在本地机器上运行):
http://localhost:9080/UTC/
|
如果此 URL 无效,请确认应用程序已部署并正在运行:
- 在管理控制台中,在已安装应用程序列表中查找 IBMUTC 应用程序(通过导航到 Applications => Enterprise Applications)并确认它已启动。
- 如果应用程序不在该列表中,则需要安装它(通过导航到 Applications => Install New Application)。该 EAR 文件位于 <was_home>\deploytool\itp\plugins\com.ibm.etools.utc_6.0.0\IBMUTC.ear -- not in the <was_home>\installableApps 目录中。如果未能找到此文件,则表明 WebSphere Application Server 安装时肯定没有安装这些示例,在这种情况下,您应该进行安装并改用 ASTK 或 Rational Application Developer。
- 当通过此 URL 打开 UTC 时,需要定位想要测试的 EJB 组件的 Home 接口。使用 JNDI Explorer,导航到 [Local EJB Beans] => ejb => com => ibm => examples => jms => MessageProducerSSBLocalHome,并选择 MessageProducerSSBLocalHome,以将其添加到导航面板的“EJB Beans”部分。(图 16)
图 16. 定位要测试的 EJB 组件

现在,可以使用 UTC 和 EJB 的 Home 接口来创建和测试 EJB,就像选择在服务器上运行它一样。
测试点到点消息传递
在第一次测试中,我们将用点到点方式发送一条测试消息并确认消息成功接收:
- 在 UTC 导航面板中,导航到 EJB Beans => MessageProducerSSBLocal => MessageProducerSSBLocalHome => MessageProducerSSBLocal create()。
图 17. 通用测试客户机

- 选择 Home 接口的 create() 方法。
- 在“Parameters”面板中,单击 Invoke 按钮。
- 在“Results”面板中,您将会注意到创建了一个名为 MessageProducerSSBLocal 1 的实例。按 Work with Object 将该实现添加到 EJB Beans 列表中。
图 18. 设置通用测试客户机

- 在 EJB Beans 列表的 MessageProducerSSBLocal 1 中,选择 Bean 的 sendMessage(String) 方法。
- 现在 Parameters 面板包含在无状态会话 Bean 上调用 sendMessage(String) 的字段和按钮。(我们已经可以发送 JMS 消息了,所以请确保能够看到 Console 视图底部或 SystemOut.log 文件末尾的文本。)
- 对于 String 参数,在 Value 字段中输入一些简单的文本以供测试,例如
test queue 123,然后单击 Invoke。
图 19. 测试点到点消息传递的字符串参数

Results 面板应该会显示方法已成功完成。等待几秒钟,如果一切正常,Console(或 SystemOut.log 文件)应该会显示这样的输出:
MESSAGE DRIVEN BEAN 'Receiver' CONSUMED MESSAGE: test queue 123
|
这个测试表明,ReceiverMDB Bean 已经接收到 MessageProducerSSB bean 刚发送到 JMSExampleQueue 队列的消息。点到点消息传递成功了!
测试发布/订阅消息传递
在接下来的测试中,我们将发布一条测试消息,并确认两个订户都成功接收到它。
在 UTC EJB Beans 列表中,在 MessageProducerSSBLocal 1 下选择 publishMessage(String) 方法。输入一些参数值(如 test topic 456),然后按 Invoke。
图 20. 测试发布/订阅消息传递的字符串参数

该方法成功完成并在几秒后应该能看到这样的输出:
MESSAGE DRIVEN BEAN 'Non-durable Subscriber' CONSUMED MESSAGE: test topic 456
MESSAGE DRIVEN BEAN 'Durable Subscriber' CONSUMED MESSAGE: test topic 456
|
这些消息表明,SubscriberNDMDB 和 SubscriberDMDB Bean 都已接收到 MessageProducerSSB Bean 刚发布到 JMSExampleTopic 主题的消息。发布/订阅消息传递成功了!
测试持久订户
在接下来的测试中,我们将显示持久订户的订阅确实是持久性的,并演示持久订阅和非持久订阅之间的区别:
- 打开管理控制台并导航到 Application servers => server1 => Message Listener Service => Listener Ports。
- 通过选中 JMSExampleTopicPort 侦听器端口的复选框并选择 Stop 来停止它。
图 21. 停止侦听器端口

状态图标应该变为一个红色的 X(指示 Stopped),并且 System.out 应该显示:
WMSG0043I: MDB Listener JMSExampleTopicPort stopped for JMSDestination jms/JMSExampleTopic
|
这表明订户应用程序已经脱机。
- 返回到 UTC,用一些示例文本(如 "test durability 789)再次运行 publishMessage(String)。结果应该显示该方法正确运行,而 System.out 没有显示什么内容。
- 等待一分钟,确认 MDB 不会接受消息;它们不应该接收,因为它们的侦听器端口没有运行,因此没有侦听任何消息。
- 返回到管理控制台并启动侦听器端口。System.out 应该再次显示侦听器端口启动:
WMSG0042I: MDB Listener JMSExampleTopicPort started successfully for JMSDestination jms/JMSExampleTopic
|
然后有一个订户接收到您一分钟前发送的消息:
MESSAGE DRIVEN BEAN 'Durable Subscriber' CONSUMED MESSAGE: test durability 789
|
只有一个订户接收到该消息,也就是持久订户,而其他订户没有接收到消息。这就是持久订阅和非持久订阅之间的区别:前者会在订户脱机时将消息排入队列中,并在订户重新在线时传递给它们;而非持久订阅在订户脱机时会自动取消订阅。
- 要表明两个订户确实又在运行,请再次运行 publishMessage(String) 并输入一些示例文本,如
test durability 000。
- System.out 显示两个订户正在运行:
MESSAGE DRIVEN BEAN 'Durable Subscriber' CONSUMED MESSAGE: test durability 000
MESSAGE DRIVEN BEAN 'Non-durable Subscriber' CONSUMED MESSAGE: test durability 000
|
持久和非持久订户成功了!
结束语
本文提供了以下信息:
- 一个非常简单的 J2EE/JMS 应用程序,它演示了点到点和发布/订阅消息传递。
- 如何用必要的队列和 MA0C SupportPac 来为发布/订阅设置 WebSphere MQ。
- 如何在 WebSphere Application Server 中配置服务器以将 WebSphere MQ 作为其 JMS 提供程序使用。我们用必要的连接工厂、队列、主题和侦听器端口来配置 MQ 提供程序以运行示例应用程序。
- 服务器如何启动应用程序及其资源。
- 演示应用程序正常工作的简单测试。
现在,您应该能够为 WebSphere Application Server 开发自己的 J2EE 应用程序来使用 WebSphere MQ(以及 MA0C SupportPac)作为 JMS 提供程序。 |