在以下部分中,了解如何从本教程中获得最大收益。
在本教程中,您将逐步了解如何配置WebSphere MQ和Rational Application Developer来进行客户机传输,远程排队和JMS发布/订阅编程。 提供了示例应用程序以及有关运行这些应用程序的说明,以演示和测试这些功能。
在本教程中,您将学习如何:
配置和测试WebSphere MQ客户端传输 配置和测试WebSphere MQ远程排队 配置和运行JMS发布/订阅应用程序如果您是Java程序员,并且需要了解如何使用WebSphere MQ和Rational Application Developer编写和测试JMS程序,那么本教程适合您。 假定您具有Java的中级知识和JMS的入门知识。 本教程中的说明还假定您已执行第1部分中的说明,因为它们是基于在该教程中创建和测试的配置和示例代码构建的。
本教程中的说明适用于Windows®环境,尽管熟悉其他操作系统的用户可能可以将其改编为在其操作系统中使用。
可通过以下链接找到本教程中使用的产品的系统要求:
WebSphere MQ Rational Application Developer在本教程系列的第1部分中,您将简要概述企业消息传递系统和JMS。 然后,您将获得IBM用于JMS开发和测试的最新工具的描述,包括有关获取,安装和配置这些工具的详细说明。 为您提供了示例程序和说明,以帮助您使用这些工具并了解它们的工作方式。
本教程从第1部分的结尾处开始,进一步探讨使用Rational Application Developer(Application Developer)进行WebSphere MQ和JMS编程。 本教程中的说明假定您已经执行了第一篇教程中的说明,因为它们是基于在该教程中创建和测试的配置和示例代码构建的。
自从发布第1部分以来,已经发布了新版本的WebSphere MQ SupportPac ME01-WebSphere MQ Initial Context Factory。 您需要下载并安装此最新版本,本教程中的示例代码才能正常工作。 转到相关信息的链接。
我要感谢并感谢此SupportPac的作者IBM Hursley Labs的Gareth Matthews先生及时为该教程提供了此新版本。
在接下来的两部分中,您将探索配置WebSphere MQ和JMS管理的对象的不同方法,以增强第一篇教程中提供的样本代码的功能。 您将要更改程序之间消息的流向,但是您将使用管理工具进行所有更改,而无需对程序进行任何更改。 这是JMS的关键优势,因为JMS将应用程序与底层消息传递实现分离开来,从而允许对消息传递系统配置进行重大更改,而无需更改应用程序。
WebSphere MQ提供了从Java程序到队列管理器的两种通信类型: bindings和client 。 这些通信类型在WebSphere MQ中称为传输类型。 绑定的传输类型要求Java程序与队列管理器在同一台计算机上执行,并使用从Java代码到队列管理器的本机接口。 在上一教程中执行的示例程序使用绑定传输。 客户端传输允许Java程序在运行队列管理器的计算机之外的工作站或其他计算机上单独运行。 队列管理器必须具有定义的服务器连接通道才能与Java客户端通信,并且专用网络路径必须可供Java客户端连接到队列管理器。
您使用WebSphere MQ资源管理器定义Java客户机所需的服务器连接通道。
从“ 开始”菜单启动WebSphere MQ Explorer。 (从这里开始,这些说明假定WebSphere MQ Explorer正在运行)。 单击Ender旁边的+号。 点击高级旁边的+号。 右键单击Channels,然后选择New> Server-connection Channel 。 (参见图1。 )现在,您可以使用JMSAdminGUI创建一个QueueConnectionFactory ,该QueueConnectionFactory使用您刚刚定义的服务器连接通道上的客户端传输。
从开始菜单启动Application Developer。 (从这里开始,这些说明假定Application Developer正在运行。) 使用C:\ workspace作为您的工作区目录。 使用右上角的视角切换按钮切换到Java视角。 (请参见图2。 )运行样本程序以测试通过客户机传输对WebSphere MQ的访问。 请注意,尽管程序使用的是不同的队列连接工厂,但它们使用的队列与以前相同。
在Application Developer中,从主菜单中选择Run> Run History> QReceiverUI 。 在Connection:字段中输入 ClientEnder ,然后按Enter或单击Set 。 在Queue:字段中输入 EnderQ并按Enter或单击Set 。 从主菜单中,选择“运行”>“运行历史记录”>“ QSenderUI” 。 在Connection:字段中输入 ClientEnder ,然后按Enter或单击Set 。 在Queue:字段中输入 EnderQ并按Enter或单击Set 。 使“队列发送者”和“队列接收器”窗口均可见。 在“队列发件人”的“ 消息:”字段中键入文本,然后按Enter或单击“ 发送” 。 消息文本应出现在“队列接收器”窗口中。 完成后,通过单击右上角的X关闭两个窗口。这些说明只能在单台计算机上使用。 我鼓励您在未安装WebSphere MQ的另一台计算机上运行QReceiverUI和QSenderUI程序,以真正演示客户端传输。 确保QueueConnectionFactory的host属性具有安装WebSphere MQ的计算机的名称,并且可以通过DNS或操作系统HOSTS将该名称解析为IP地址。 您还可以提供主机属性的IP地址。 还必须配置JMSAdminGUI用作其提供程序URL的队列管理器以进行客户端传输。
到目前为止,您一直在传输的消息已放在一个队列中并从同一队列中读取。 尽管在某些情况下需要此配置,但企业消息传递系统的真正功能在于其将消息从一台计算机移动到另一台计算机的能力,从而使应用程序程序员不必知道网络和通信协议的细节。 在WebSphere MQ中,此消息流发生在队列管理器之间。 与上一节中描述的客户机配置不同,队列管理器之间不需要专用的网络连接。 当与接收队列管理器的连接不可用时,发送队列管理器可以存储消息,然后在恢复通信后立即转发累积的消息。
此方案的配置需要远程队列的本地定义 ,简称为远程队列 。 对于应用程序,远程队列看起来与普通本地队列没有什么不同。 但是,WebSphere MQ“知道”放置在远程队列上的消息实际上是发往另一个队列管理器上的队列的;它实际上是发往另一个队列管理器的。 然后采取必要步骤将消息移至目标队列。 该配置还需要传输队列 ,这是队列管理器用来保存发往另一个队列管理器的消息的一种本地队列。
在这里,您将在计算机上定义第二个队列管理器,并在该队列管理器上定义本地队列,这将成为远程队列的目标。
在WebSphere MQ资源管理器中,右键单击“ 队列管理器”,然后选择“ 新建”>“队列管理器” 。 在队列管理器名称:字段中输入Petra 。 在“死信队列:”字段中键入SYSTEM.DEAD.LETTER.QUEUE 。 单击下一步三下。 在“ 侦听端口号:”字段中键入1415 (队列管理器Ender已经在使用默认端口1414,因此此队列管理器必须使用其他端口)。 点击完成 。 单击Petra旁边的+号。 右键单击队列,然后选择新建>本地队列 。 (参见图5。 )现在,在原始队列管理器上,您需要创建一个传输队列和一个远程队列,将其指向第二个队列管理器上的目标队列。
右键单击Ender下的Queues ,然后选择New> Local Queue 。 在名称:字段中输入Petra 。 (按照惯例,传输队列是为将用于进行通信的远程队列管理器命名的。) 单击下一步 。 从用法:下拉列表中选择传输 。 (参见图6。 )在队列管理器之间传输消息的机制称为通信通道 。 要创建通信通道,必须在每个队列管理器上创建一个通道定义-正在发送消息的队列管理器上的发送者通道 ,以及正在接收消息的队列管理器上的接收者通道 。 通信通道的两端具有相同的名称,通常指示消息流的方向。
在WebSphere MQ Explorer中,单击Petra下Advanced旁边的+号。 右键单击Channels,然后选择New> Receiver Channel 。 (请参见图8。 )现在,您可以运行示例程序来测试远程排队。 因为我们使用的是SupportPac ME01,所以您无需显式创建JMS管理的对象;因此,无需执行任何操作。 隐式JMS管理的对象可用于我们创建的队列管理器和队列。 您必须更改接收程序以将Petra队列管理器用作其提供程序URL,因为这是接收队列所在的位置。
在Application Developer中,从主菜单中选择Run> Run 。 在“ 配置:”列表中选择QReceiverUI 。 单击参数选项卡。 将java.naming.provider.url更改为Petra 。 (参见图11。 )为了更有效地演示远程排队,建议您在两台不同的计算机上设置WebSphere MQ,并在一台计算机上运行QSenderUI,在另一台计算机上运行QReceiverUI。 发送者通道的连接名称必须是可以解析为IP地址或实际IP地址的名称。 每台计算机上的每个队列管理器都可以使用端口1414(WebSphere MQ的默认端口),并且不必在连接名称后的括号中放置端口号。
在结束对WebSphere MQ配置的讨论之前,您应该了解客户机访问和远程排队可以结合使用。 因此,一台计算机上的应用程序可以使用客户端访问将消息放在第二台计算机上运行的队列管理器的远程队列上。 该队列管理器可以将消息传输到在第三台计算机上运行的队列管理器上的目标队列。 然后,在第四台计算机上运行的应用程序可以使用客户端访问从目标队列中检索消息。 图12中说明了这种情况。
在接下来的两部分中,您将配置和运行示例程序,以演示JMS的发布/订阅功能。 在第一部分中,您将使用WebSphere MQ作为JMS提供程序来运行程序。 在第二部分中,您将使用Application Developer随附的WebSphere测试环境提供的内置JMS提供程序来运行程序。
WebSphere MQ带有内置的消息代理,以支持发布/订阅应用程序。 您将运行提供的命令文件来设置代理,然后启动代理进行操作。
打开命令提示符,然后转到目录C:\ WSMQ \ Java \ bin。 键入runmqsc Ender<mqjms_psq.mqsc 。 (参见图13。 )在设置,运行和测试示例代码之前,请看一下代码在做什么。 像在第1部分中一样,我们将不会花费任何时间来研究用户界面类,而只需花一些时间使用JMS代码。
该ChatUser类用于由ChatUserUI发布消息,订阅,并从进入主题接收消息。 在点对点示例程序中,一个类用于发送消息,另一类用于接收消息。 发送和接收都由ChatUser处理。 在ChatUser中使用JMS编程的方法类似于点对点类中的方法。 这些是setConnection() , setTopic() , publishMessage()和onMessage() 。 首先看清单1所示的setConnection() 。
对close()的调用可确保已正确关闭任何活动的JMS对象。 然后,通过JNDI进行查找,以获取名称作为connectionName参数传入的TopicConnectionFactory 。 一旦TopicConnectionFactory被检索和TopicConnection创建两个TopicSession创建参数,一个用于发布和一个订阅。 可以从单个会话发布和接收消息,但前提是未为该会话激活异步消息传递。 因为ChatUser依赖于异步消息传递,所以我们需要两个会话。
下一个要查看的方法是setTopic() 。 在GUI中输入Topic名称时,将调用此方法,如清单2所示。
对stop()的调用可确保TopicConnection被停止,并且所有活动的TopicPublisher和TopicSubscriber对象均被关闭。 然后使用topicName参数从JNDI检索Topic对象。 接下来,使用各自的TopicSession对象创建TopicPublisher和TopicSubscriber对象。 为TopicSubscriber设置了用于异步消息传递的消息侦听器; ChatUser实现了MessageListener接口,当消息到达订阅主题时,将异步调用ChatUser的onMessage()方法。 然后启动TopicConnection并sendEnterMessage() ,它发布消息,宣布用户已进入聊天室。
发布消息时,将publishMessage()方法,如清单3所示。
如您所见, publishMessage()只是接受传入的String ,为用户名加上publishMessage() ,然后将String传递给私有方法internalPublishMessage() 。 在internalPublishMessage() ,使用text参数创建一个TextMessage ,并使用TopicPublisher发布消息。
在ChatUser查看的最后一个方法是onMessage() ,如清单4所示。
每当消息发布到订阅的主题时,JMS都会调用此方法。 消息的文本用于设置ChatUser对象的message属性。 该代码应该看起来很熟悉,因为它与QReceiver的onMessage()方法QReceiver 。 使用JMS编程,接收发送到队列的消息和接收发布到主题的消息是完全相同的。
除了没有消息发布功能之外, ChatUser类与ChatMonitor类非常相似。 该setConnection()和setTopic()方法很像在ChatUser ,除了没有关于发布代码,所以我们不会去对这些详细。 但是,让我们看一下清单5所示的onMessage()方法。
首先,在getJMSDestination()的Message对象上调用getJMSDestination()方法。因为已知消息来自Topic ,所以Destination被转换为Topic 。 然后,对Topic上的getTopicName()进行调用,将主题名称添加到消息文本的前面,并将所得的String用于设置ChatMonitor的message属性。
现在,您将使用JMSAdminGUI定义TopicConnectionFactory和一组供聊天程序使用的分层Topics 。
在Application Developer中,选择“运行”>“运行历史记录”>“ JMSAdminGUI” 。 单击“ 打开最近的配置文件:”按钮,选择C:/workspace/JMSAdminGUI/WMQ.config ,然后单击“ 确定” 。 从主菜单中,选择“ 对象”>“新建”>“ MQTopicConnectionFactory” 。 在“ 对象名称:”字段中键入EnderTCF 。 单击标准属性选项卡。 在队列管理器:字段中输入Ender 。 在Broker QMgr:字段中输入Ender 。 (参见图14。 )现在,您可以运行示例程序来测试发布/订阅。 您将需要像使用点对点程序一样为每个程序设置VM参数和类路径。
在MQPubSub项目中右键单击ChatUI,然后选择Run> Run 。 在“ 配置:”列表中选择“ Java应用程序 ”。 点击新建 。 单击参数选项卡。 在“ VM参数:”文本区域中,键入以下参数,每个参数之间用空格分隔。 -Djava.naming.factory.initial=com.ibm.mq.jms.context.WMQInitialContextFactory -Djava.naming.provider.url=Ender -Dsun.boot.library.path=C:\RAD\eclipse\jre\bin;C:\WSMQ\Java\lib 除了参数之间的空格外,不应有其他空格或回车符。 确保在每个参数之前包括连字符。 参数将包装在VM参数:文本区域中。 只要您不键入空格(参数之间的空格除外)或插入回车符,就可以了。 单击类路径选项卡。 单击“ Classpath:”列表中的“ Bootstrap项 ”。 单击添加外部JARS 。 导航到MQTools文件夹,然后选择以下JAR文件: com.ibm.mq.pcf.jar mqcontext.jar 点击打开 。 再次单击添加外部JARS 。 导航到C:\ WSMQ \ Java \ lib并选择以下JAR文件: com.ibm.mq.jar com.ibm.mqjms.jar 连接器.jar dhbcore.jar jms.jar 点击打开 。 点击运行 。 在“聊天”窗口的“ 用户名:”字段中键入User1 ,然后按Enter或单击“ 设置” 。 在Connection:字段中输入 EnderTCF ,然后按Enter或单击Set 。 在主题:字段中输入 Java ,然后按Enter或单击设置 。 将显示消息“用户1已进入聊天室”。 在Application Developer中,从主菜单中选择Run> Run History> ChatUI 。 在第二个“聊天”窗口中,在“ 用户名:”字段中键入User2 ,然后按Enter或单击“ 设置” 。 在Connection:字段中输入 EnderTCF ,然后按Enter或单击Set 。 在主题:字段中输入 Java ,然后按Enter或单击设置 。 您将在两个聊天窗口中看到消息“用户2已进入聊天室”。 在任一窗口的消息:字段中,键入任何文本,然后按Enter或单击发送 。 消息文本显示在两个窗口中,并以发布消息的用户名作为前缀。 尝试将每个窗口中的主题更改为使用JMSAdminGUI创建的其他主题之一。 但是,请勿尝试使用AllComputers,AllBooks或AllTopics,因为不允许发布对通配符(*)主题进行通配,而只能进行订阅。 另外,请尝试使用其他用户名运行其他ChatUI实例。 在继续下一步之前,将其中一个“聊天”窗口上的主题更改为Java。 返回到应用程序开发人员。 从主菜单中,选择运行>运行 。 右键单击Configurations:列表中的ChatUI ,然后选择Duplicate 。 将ChatUI(1)重命名为ChatMonitorUI 。 将Main class字段更改为com.ibm.qbda.mq.pubsub.ChatMonitorUI 。 点击应用 。 点击运行 。 在聊天监视器窗口的“ 连接:”字段中键入EnderTCF ,然后按Enter或单击“ 设置” 。 在主题:字段中输入 AllComputers ,然后按Enter或单击设置 。 切换到使用Java主题的聊天窗口,确保聊天监视器窗口可见并发送消息。 消息文本将显示在聊天监视器窗口中,该窗口之前是消息发布到的主题和发布消息的用户。 切换到使用Java主题的聊天窗口,然后在Topic:字段中键入Linux ,然后按Enter或单击Set 。 从该聊天窗口发送消息。 消息文本将显示在聊天监视器窗口中。 在使用Linux主题的聊天窗口中,输入Cyberpunk并按Enter或单击Set 。 从该聊天窗口发送消息。 您不会在聊天监视器窗口中看到该消息。 在聊天监视器窗口中,输入AllTopics并按Enter或单击设置 。 切换到使用“计算机朋克”主题的聊天窗口,然后发送一条消息。 您将在聊天监视器窗口中看到该消息。 完成后,通过单击右上角的X关闭所有聊天和聊天监控窗口。现在,您可以使用Application Developer中包含的WebSphere测试环境提供的内置JMS提供程序来运行示例程序。
与点对点程序一样,我将pub / sub程序重新打包为应用程序客户端,以便使用WebSphere测试环境运行。
在Application Developer中,从主菜单中选择File> Import 。 选择Project Interchange作为导入源,然后单击Next 。 在“ 从zip文件:”字段中,输入先前提取的EMQPubSub.zip文件的位置。 单击全选 ,然后单击完成 。在本教程中,您选择了上一教程的开头,并探讨了JMS编程中的其他一些主题,包括WebSphere MQ客户端传输,WebSphere MQ远程排队和JMS发布/订阅编程。
在下一个教程中,您将研究如何使用WebSphere MQ作为WebSphere Application Server中的JMS提供程序。 您还将使用JMS 1.1中提供的统一域接口来探索JMS编程。
翻译自: https://www.ibm.com/developerworks/websphere/tutorials/i-mqrad2/i-mqrad2.html
相关资源:Websphere MQ入门教程-使用IBM Websphere MQ