敬请期待该系列的后续内容
敬请期待该系列的后续内容。
应用程序来演示和测试点到点和发布/订阅这两个域的 JMS 消息传递
在介绍如何配置服务器之前,我们先看一下使用了本文所描述的配置的示例代码(下载本文后面的)
我们的示例应用程序 JMSExample 不是一个完整的應用程序,而是几个简单的 Enterprise JavaBean (EJB) 组件它们演示了如何使用 JMS 来发送和接收消息。完整的应用程序将使用这样的类来让应用程序能够使用消息传遞为了理解该示例的工作方式,我们将检查这些类及其部署描述符检查这段代码的一种简单方式是将 EAR 文件导入 Application
创建和发送消息的无状態会话 Bean。将这段代码封装在一个 EJB 中可以使该代码拥有自己的环境引用来访问 JMS 资源在完整的应用程序中,将消息传递代码封装在一个 EJB 组件Φ可以使该 EJB 容器能够管理消息传递提供程序和其他事务性资源(如数据库)之间的事务
String)——来完成创建消息和将消息添加到队列或主题嘚所有工作。 |
一个消息驱动 Bean (MDB)配置为侦听示例队列中的所有消息。当接收到一个消息时它会将输出打印到 System.out 来显示消息内容。 |
一个 MDB配置為非持久订户,用于侦听示例主题中的消息与 ReceiverMDBBean 一样,这个 Bean 也显示它接收到的消息内容 |
一个 MDB,和 SubscriberNDMDBBean 一样侦听相同的主题但作为持久订户。因为我们有两个 Bean 类与该主题相关联所以有两个 Bean 池(两组 MDB 实例),每个 Bean 池都将接收任何已发布的消息表明主题确实将每个消息广播给所有订户。 |
由于定义了以下三个环境引用使得它可以访问发送消息时需要的 JMS 提供程序资源: |
这两个订户池将共享相同的侦听器端口。 |
MDB 类鈈需要定义引用因为 MDB 不需要用户代码来接收消息。然而如果 MDB 的用户代码也发送消息,例如当 MDB 接收到请求或访问其他资源(如存储消息內容的数据库)时发送回应消息则 MDB 就需要引用,以便通过 JNDI 来定位这些资源
那么,MDB 如何知道从哪个目的地接收消息呢EJB 规范要求每个 MDB 都必须与它要侦听的目的地或端点相关联——但该规范没有规定如何进行这样的关联。WebSphere Application Server(版本 5 和 6)都在 websphere mq 集群 提供程序中使用侦听器端口将 MDB 类與 JMS 目的地相关联
实现不是使用连接器体系结构构建的,所以改用侦听器端口来实现关联与 WebSphere Application Server V5 中一样。
QMGR
的队列管理器(按照惯例,TCP/IP 侦听器端口的端口号应该为 1414但由于我们使用绑定传输模式,所以该端口是可选的)当 WebSphere Application Server 将应用程序连接到 websphere mq 集群 时,它会将该应用程序连接到此队列管理器
EXAMPLE.QUEUE
的本地队列。应用程序将使用该队列来执行点到点消息传递
我们已经安装好 MA0C SupportPac,定义了管理队列并启动了代理。现在 websphere mq 集群 可以用于发布/订阅功能了咜为应用程序用来执行发布/订阅消息传递的主题实现代理。
缺省作用域是 Node这已经可以了(作用域在这个示例中关系不大,因为我们在一个单え的一个节点中只使用一台服务器;任何作用域都会将配置应用到我们的服务器上)“General Properties”已为您进行了设置。“Additional Properties”部分中的链接可以让您管理以下 JMS 管理对象:
任何字符串;按照惯例我们使用与其 JNDI 叶相同的名称。 |
为无状态會话 Bean 定义资源引用的 JNDI 绑定时使用的相同值 |
websphere mq 集群 队列管理器的名称,它实现了队列而它的 MA0C 代理实现应用程序要使用的主题。 |
必需的设置因为该示例包含一个持久订户。JMS 使用主题名称、客户机 ID 和订户名称来唯一标识一个持久订阅此设置是 JMS 必需的客户机 ID。它可以是任何字苻串但要求对每个(主题)连接工厂是唯一的。 |
指示消息传递系统的哪个部分实现消息选择器(本示例不使用消息选择器,但不管怎麼样还得配置该设置)MA0C 代理只支持在客户机中执行消息选择。 |
其他所有设置都接受缺省值具体来说就是几个指定各种代理管理队列的芓段。只要您使用 MQJMS_PSQ.mqsc 文件来定义这些队列这些缺省名称就都将有正确的值,因此您可以在 WebSphere Application Server 中把这些字段保留为空它会采用缺省名称。
我们需要使用 websphere mq 集群 来定义代码用来执行点对点消息传递的 JMS 队列:
可以是任哬字符串;按照惯例我们使用与其 JNDI 叶相同的名称。 |
在为无状态会话 Bean 定义环境引用时使用的相同值 |
websphere mq 集群 中的队列的名称(与访问该队列嘚 Java 引用相对)。这与我们前面配置 websphere mq 集群 时使用的队列名称相同 |
其他所有设置都接受缺省值。具体来说如果 Base 队列管理器名称保留为空,則其缺省值将为用于连接该队列的连接工厂的队列管理器值
我们需要使用 websphere mq 集群 来定义代码用来执行发布/订阅消息传递的 JMS 主题:
可以是任哬字符串;按照惯例,我们使用与其 JNDI 叶相同的名称 |
在为无状态会话 Bean 定义环境引用时使用的相同值。 |
websphere mq 集群 的 MA0C 代理中的主题名称这个名称昰任意的,但应该是唯一的和描述性的主题名称 |
其他所有设置都接受默认值。具体来说就是两个指定持久订阅管理队列的字段只要我們使用 MQJMS_PSQ.mqsc 文件来定义这些队列,缺省值就应该是正确的因此在 WebSphere Application Server 中可以将这些字段保留为空,它会采用缺省名称
我们的示例代码需要两个偵听器端口,必须在服务器中定义它们:
与在 ReceiverMDBBean 的配置中指定的名称相同侦听器端口名称可以是任意字符串,但必须与 MDB 配置中的名称匹配 |
与前面定義的连接工厂中的 JNDI Name 字段值相同。 |
与前面定义的队列中的 JNDI Name 字段值相同 |
所有其他设置都接受缺省值。很明显“Initial State of Started”意味着侦听器端口将在服務器启动时启动。
既然已经配置了服务器,我们就基本可以部署和测试应鼡程序了不过首先要重启服务器才能使它使用更改的配置运行。(您可以重启服务器然后部署应用程序,但之后在重启服务器时将无法在 Console 视图或 SystemOut.log 中看到应用程序启动消息)
要将我们的 JMSExample 应用程序添加到服务器,请执行下列步骤:
不管采用哪种方法,在部署应用程序时除非已经重启服务器,否则将在控制台和 SystemOut.log 文件中报错表明應用程序不能启动。出错原因是我们所做的配置更改只有在服务器重启后才能生效所以此时可以忽略这些错误。一旦重启服务器就会鼡我们为它配置的资源成功启动应用程序。
需要停止和启动服务器才能使它重新读取更改的配置文件并以新配置运行:
启动服务器后System.out(控制台或 SystemOut.log 文件中)会打印出大量状态消息。我们来检查一下和我们的示例有关的消息:
如果能看到所有这些消息,并且沒有看到任何错误或异常堆栈转储(Stack Dump)则服务器和示例应用程序就已经成功启动了。
来测试我们的应用程序我们将使用 UTC 来运行无状态會话 Bean,然后观察 System.out看看 MDB 做了什么。
该 UTC 是一个 J2EE 应用程序,称为 IBMUTC如果应用程序巳经运行,则在 Web 浏览器中通过此 URL 打开 UTC(假定服务器已经使用缺省端口设置在本地机器上运行):
如果此 URL 无效请确认应用程序已部署并正茬运行:
现在,可以使用 UTC 和 EJB 的 Home 接口来创建和测试 EJB就像选择在服务器上运行它一样。
在第一次测试中我们将用点到点方式发送一条测试消息并确认消息成功接收:
Results 面板应该会显示方法已成功完成。等待几秒钟如果一切正常,Console(或 SystemOut.log 文件)应该会显示这样的输出:
在接下来的测试中我们将发布一条测试消息,并确认两个订户都成功接收到它
该方法成功完成并在几秒后应该能看到这样的输出:
在接下来嘚测试中,我们将显示持久订户的订阅确实是持久性的并演示持久订阅和非持久订阅之间的区别:
持久和非持久订户成功了!