在以下部分中,了解如何从本教程中获得最大收益。
在本教程中,您将逐步了解如何配置WebSphere MQ和Rational Application Developer来进行客户机传输,远程排队和JMS发布/订阅编程。 提供了示例应用程序以及有关运行这些应用程序的说明,以演示和测试这些功能。
在本教程中,您将学习如何:
如果您是Java程序员,并且需要了解如何使用WebSphere MQ和Rational Application Developer编写和测试JMS程序,那么本教程适合您。 假定您具有Java的中级知识和JMS的入门知识。 本教程中的说明还假定您已执行第1部分中的说明,因为它们是基于在该教程中创建和测试的配置和示例代码构建的。
本教程中的说明适用于Windows®环境,尽管熟悉其他操作系统的用户可能可以将其改编为在其操作系统中使用。
可通过以下链接找到本教程中使用的产品的系统要求:
在本教程系列的第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客户机所需的服务器连接通道。
java.channel
,然后单击完成 。 现在,您可以使用JMSAdminGUI创建一个QueueConnectionFactory
,该QueueConnectionFactory
使用您刚刚定义的服务器连接通道上的客户端传输。
ClientEnder
。 Ender
。 1414
。 java.channel
。 localhost
。 该对话框应如图4所示 。 运行样本程序以测试通过客户机传输对WebSphere MQ的访问。 请注意,尽管程序使用的是不同的队列连接工厂,但它们使用的队列与以前相同。
ClientEnder
,然后按Enter或单击Set 。 EnderQ
并按Enter或单击Set 。 ClientEnder
,然后按Enter或单击Set 。 EnderQ
并按Enter或单击Set 。 这些说明只能在单台计算机上使用。 我鼓励您在未安装WebSphere MQ的另一台计算机上运行QReceiverUI和QSenderUI程序,以真正演示客户端传输。 确保QueueConnectionFactory的host属性具有安装WebSphere MQ的计算机的名称,并且可以通过DNS或操作系统HOSTS将该名称解析为IP地址。 您还可以提供主机属性的IP地址。 还必须配置JMSAdminGUI用作其提供程序URL的队列管理器以进行客户端传输。
到目前为止,您一直在传输的消息已放在一个队列中并从同一队列中读取。 尽管在某些情况下需要此配置,但企业消息传递系统的真正功能在于其将消息从一台计算机移动到另一台计算机的能力,从而使应用程序程序员不必知道网络和通信协议的细节。 在WebSphere MQ中,此消息流发生在队列管理器之间。 与上一节中描述的客户机配置不同,队列管理器之间不需要专用的网络连接。 当与接收队列管理器的连接不可用时,发送队列管理器可以存储消息,然后在恢复通信后立即转发累积的消息。
此方案的配置需要远程队列的本地定义 ,简称为远程队列 。 对于应用程序,远程队列看起来与普通本地队列没有什么不同。 但是,WebSphere MQ“知道”放置在远程队列上的消息实际上是发往另一个队列管理器上的队列的;它实际上是发往另一个队列管理器的。 然后采取必要步骤将消息移至目标队列。 该配置还需要传输队列 ,这是队列管理器用来保存发往另一个队列管理器的消息的一种本地队列。
在这里,您将在计算机上定义第二个队列管理器,并在该队列管理器上定义本地队列,这将成为远程队列的目标。
Petra
。 SYSTEM.DEAD.LETTER.QUEUE
。 1415
(队列管理器Ender已经在使用默认端口1414,因此此队列管理器必须使用其他端口)。 PetraQ
。 点击完成 。 现在,在原始队列管理器上,您需要创建一个传输队列和一个远程队列,将其指向第二个队列管理器上的目标队列。
Petra
。 (按照惯例,传输队列是为将用于进行通信的远程队列管理器命名的。) RemotePetraQ
。 PetraQ
。 Petra
。 Petra
。 (参见图7。 ) 在队列管理器之间传输消息的机制称为通信通道 。 要创建通信通道,必须在每个队列管理器上创建一个通道定义-正在发送消息的队列管理器上的发送者通道 ,以及正在接收消息的队列管理器上的接收者通道 。 通信通道的两端具有相同的名称,通常指示消息流的方向。
Ender_2_Petra
。 Ender_2_Petra
。 localhost(1415)
。 Petra
。 (参见图9。 ) 现在,您可以运行示例程序来测试远程排队。 因为我们使用的是SupportPac ME01,所以您无需显式创建JMS管理的对象;因此,无需执行任何操作。 隐式JMS管理的对象可用于我们创建的队列管理器和队列。 您必须更改接收程序以将Petra队列管理器用作其提供程序URL,因为这是接收队列所在的位置。
Petra
。 (参见图11。 ) Petra
并按Enter或单击Set 。 PetraQ
并按Enter或单击Set 。 Ender
,然后按Enter或单击Set 。 RemotePetraQ
并按Enter或单击Set 。 为了更有效地演示远程排队,建议您在两台不同的计算机上设置WebSphere MQ,并在一台计算机上运行QSenderUI,在另一台计算机上运行QReceiverUI。 发送者通道的连接名称必须是可以解析为IP地址或实际IP地址的名称。 每台计算机上的每个队列管理器都可以使用端口1414(WebSphere MQ的默认端口),并且不必在连接名称后的括号中放置端口号。
在结束对WebSphere MQ配置的讨论之前,您应该了解客户机访问和远程排队可以结合使用。 因此,一台计算机上的应用程序可以使用客户端访问将消息放在第二台计算机上运行的队列管理器的远程队列上。 该队列管理器可以将消息传输到在第三台计算机上运行的队列管理器上的目标队列。 然后,在第四台计算机上运行的应用程序可以使用客户端访问从目标队列中检索消息。 图12中说明了这种情况。
在接下来的两部分中,您将配置和运行示例程序,以演示JMS的发布/订阅功能。 在第一部分中,您将使用WebSphere MQ作为JMS提供程序来运行程序。 在第二部分中,您将使用Application Developer随附的WebSphere测试环境提供的内置JMS提供程序来运行程序。
WebSphere MQ带有内置的消息代理,以支持发布/订阅应用程序。 您将运行提供的命令文件来设置代理,然后启动代理进行操作。
runmqsc Ender 。
(参见图13。 ) strmqbrk -m Ender
并按Enter 。 在设置,运行和测试示例代码之前,请看一下代码在做什么。 像在第1部分中一样,我们将不会花费任何时间来研究用户界面类,而只需花一些时间使用JMS代码。
该ChatUser
类用于由ChatUserUI
发布消息,订阅,并从进入主题接收消息。 在点对点示例程序中,一个类用于发送消息,另一类用于接收消息。 发送和接收都由ChatUser
处理。 在ChatUser
中使用JMS编程的方法类似于点对点类中的方法。 这些是setConnection()
, setTopic()
, publishMessage()
和onMessage()
。 首先看清单1所示的setConnection()
。
public void setConnection(String connectionName)
throws JMSException, NamingException, Throwable {
try {
close();
TopicConnectionFactory factory =
(TopicConnectionFactory) getInitContext().lookup(connectionName);
connection = factory.createTopicConnection();
publisherSession =
connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
subscriberSession =
connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
} catch (Throwable e) {
setExceptionMessage(e);
throw e;
}
}
对close()
的调用可确保已正确关闭任何活动的JMS对象。 然后,通过JNDI进行查找,以获取名称作为connectionName
参数传入的TopicConnectionFactory
。 一旦TopicConnectionFactory
被检索和TopicConnection
创建两个TopicSession
创建参数,一个用于发布和一个订阅。 可以从单个会话发布和接收消息,但前提是未为该会话激活异步消息传递。 因为ChatUser
依赖于异步消息传递,所以我们需要两个会话。
下一个要查看的方法是setTopic()
。 在GUI中输入Topic
名称时,将调用此方法,如清单2所示。
public void setTopic(String topicName)
throws JMSException, NamingException, Throwable {
try {
stop();
Topic topic = (Topic) getInitContext().lookup(topicName);
publisher = publisherSession.createPublisher(topic);
subscriber = subscriberSession.createSubscriber(topic);
subscriber.setMessageListener(this);
connection.start();
sendEnterMessage();
} catch (Throwable e) {
publisher = null;
subscriber = null;
setExceptionMessage(e);
throw e;
}
}
对stop()
的调用可确保TopicConnection
被停止,并且所有活动的TopicPublisher
和TopicSubscriber
对象均被关闭。 然后使用topicName
参数从JNDI检索Topic
对象。 接下来,使用各自的TopicSession
对象创建TopicPublisher
和TopicSubscriber
对象。 为TopicSubscriber
设置了用于异步消息传递的消息侦听器; ChatUser
实现了MessageListener
接口,当消息到达订阅主题时,将异步调用ChatUser
的onMessage()
方法。 然后启动TopicConnection
并sendEnterMessage()
,它发布消息,宣布用户已进入聊天室。
发布消息时,将publishMessage()
方法,如清单3所示。
public void publishMessage(String message) throws JMSException, Throwable {
try {
internalPublishMessage(getUserName() + ": " + message);
} catch (Throwable e) {
setExceptionMessage(e);
throw e;
}
}
如您所见, publishMessage()
只是接受传入的String
,为用户名加上publishMessage()
,然后将String
传递给私有方法internalPublishMessage()
。 在internalPublishMessage()
,使用text
参数创建一个TextMessage
,并使用TopicPublisher
发布消息。
在ChatUser
查看的最后一个方法是onMessage()
,如清单4所示。
public void onMessage(Message message) {
String msgText = null;
try {
msgText = ((TextMessage) message).getText();
} catch (Throwable e) {
setExceptionMessage(e);
msgText = getExceptionMessage();
} finally {
setMessage(msgText);
}
}
每当消息发布到订阅的主题时,JMS都会调用此方法。 消息的文本用于设置ChatUser
对象的message
属性。 该代码应该看起来很熟悉,因为它与QReceiver
的onMessage()
方法QReceiver
。 使用JMS编程,接收发送到队列的消息和接收发布到主题的消息是完全相同的。
除了没有消息发布功能之外, ChatUser
类与ChatMonitor
类非常相似。 该setConnection()
和setTopic()
方法很像在ChatUser
,除了没有关于发布代码,所以我们不会去对这些详细。 但是,让我们看一下清单5所示的onMessage()
方法。
public void onMessage(Message message) {
String msgText = null;
try {
msgText =
(((Topic) message.getJMSDestination()).getTopicName()
+ ": "
+ ((TextMessage) message).getText());
} catch (Throwable e) {
setExceptionMessage(e);
msgText = getExceptionMessage();
} finally {
setMessage(msgText);
}
}
首先,在getJMSDestination()
的Message
对象上调用getJMSDestination()
方法。因为已知消息来自Topic
,所以Destination
被转换为Topic
。 然后,对Topic
上的getTopicName()
进行调用,将主题名称添加到消息文本的前面,并将所得的String
用于设置ChatMonitor
的message
属性。
现在,您将使用JMSAdminGUI定义TopicConnectionFactory
和一组供聊天程序使用的分层Topics
。
EnderTCF
。 Ender
。 Ender
。 (参见图14。 ) Java
。 computers/Java
。 (参见图15。 ) 对象名称: | 话题: |
---|---|
的Linux | 电脑/ Linux |
所有计算机 | 电脑/* |
赛博朋克 | 书籍/数码朋克 |
诗歌 | 书/诗歌 |
全书 | 图书/* |
AllTopics | * |
现在,您可以运行示例程序来测试发布/订阅。 您将需要像使用点对点程序一样为每个程序设置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
User1
,然后按Enter或单击“ 设置” 。 EnderTCF
,然后按Enter或单击Set 。 Java
,然后按Enter或单击设置 。 User2
,然后按Enter或单击“ 设置” 。 EnderTCF
,然后按Enter或单击Set 。 Java
,然后按Enter或单击设置 。 ChatUI
实例。 ChatMonitorUI
。 com.ibm.qbda.mq.pubsub.ChatMonitorUI
。 EnderTCF
,然后按Enter或单击“ 设置” 。 AllComputers
,然后按Enter或单击设置 。 Linux
,然后按Enter或单击Set 。 Cyberpunk
并按Enter或单击Set 。 AllTopics
并按Enter或单击设置 。 现在,您可以使用Application Developer中包含的WebSphere测试环境提供的内置JMS提供程序来运行示例程序。
与点对点程序一样,我将pub / sub程序重新打包为应用程序客户端,以便使用WebSphere测试环境运行。
BeanTCF
。 jms/BeanTCF
。 Java
。 jms/Java
。 computers/Java
。 名称 | JNDI名称 | 主题名称 |
---|---|---|
的Linux | jms / Linux | 电脑/ Linux |
所有计算机 | jms / AllComputers | 电脑/* |
赛博朋克 | jms / Cyberpunk | 书籍/数码朋克 |
诗歌 | jms /诗歌 | 书/诗歌 |
全书 | jms / AllBooks | 图书/* |
EChat
。 User1
,然后按Enter或单击设置 。 jms/BeanTCF
,然后按Enter或单击Set 。 jms/Java
,然后按Enter或单击设置 。 User2
,然后按Enter或单击“ 设置” 。 jms/BeanTCF
,然后按Enter或单击Set 。 jms/Java
,然后按Enter或单击设置 。 EChat
实例。 EChatMonitor
。 EChatMonitor
。 jms/BeanTCF
,然后按Enter或单击Set 。 jms/AllComputers
,然后按Enter或单击设置 。 jms/Linux
。 接下来,按Enter或单击“ 设置” 。 jms/Cyberpunk
,然后按Enter或单击Set 。 在本教程中,您选择了上一教程的开头,并探讨了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