WebSphere MQ7 实现多点广播

原文翻译自:http://blog.csdn.net/yaominhua/article/details/8612569

加上了一些自己的理解和注释。去掉了一些不必要的步骤。


最近由于工作需要,需要用到MQ服务器,这边用的是IBM MQ服务器。IBM除了卖软件还主要卖服务,什么是服务?就是所谓的技术支持。软件、数据库、服务器卖给你了,你还必须要请IBM的专家来搞,不然你自己搞不明白。所以说,IBM的东西公开的资料非常少,没有前人指路,只能自己摸索。

P话少说了,这次想实现的功能是程序发送数据到MQ服务器点A上(至于我为什么说点A,而不是队列A、主题A,后后面会讲),然后另外一个程序去监听队列A1,A2,A3等等。。可以看出来我需要实现数据分发的功能。有两个思路实现这个功能。

1.使用程序来实现数据分发。程序推送数据到队列A上(这时候上文提到的点A就是一个队列啦),然后启动一个监听器监听队列A,监听到数据后再推送到队列A1,A2。。然后另外两个监听器去监听队列A1,A2。

能够满足功能需求!并且简单易懂,容易操作。对于上面这个思路,有人可能质疑这样是否给自己找麻烦,因为我把数据推到队列A,然后监听,再推到队列A1,A2中。为什么不直接推送到队列A1,A2上面去呢?这里其实涉及到抽象、涉及模式的问题。我们将推送到队列A1,A2这个操作抽出来,提供给调用者的只是推送到一个队列的操作。减少耦合。。不多说。。


    2.使用MQ的发布订阅模式实现功能。简单来说程序推数据到主题(topic)A上(这时候,上文说的点A就是一个主题),然后利用MQ的订阅功能,让队列A1,A2订阅主题A。程序再去监听A1,A2两个队列。思路都懂,就是怎么配置MQ服务器,让队列A1,A2订阅主题A。这个是本文的重点,下面是具体的操作:


①准备工作(一)

IBMMQ服务器版本:MQ7.0.1.5

  操作系统:Windows 7 Enterprise

程序语言:java

jdk版本:  jdk1.7

整个多点广播的概要图如下图所示:WebSphere MQ7 实现多点广播_第1张图片

  

大概意思就是:Subscriber1,Subscriber2,Subscriber3订阅了主题“topic”,Subscriber1,Subscriber2,Subscriber3分别指向队列管理器QM1中的三个远程队列remote_queue1,remote_queue2,remote_queue3,这三个远程队列是通过传播队列TransmitQueue与队列管理器QM2中的LocalQueue1,LocalQueue2,LocalQueue3一一对应。你可能注意到QM2中还有三个所谓的别名队列AliasQueue1,AliasQueue2,AliasQueue3,翻译的原文中用到了这三个别名队列,但我觉得没有意义,并且没有他们也能测试通顺。因此下面的配置步骤中也没有别名队列的身影。怎么才能使得QM1中的远程队列发送消息到QM2中的本地队列呢?当然是通过发送通道和接收通道啦。因此我们需要在QM1中配置发送通道,在QM2中配置接收通道。

       原文中的这个图有问题,我做了一点更改,谢谢英子帮我P的图。O(∩_∩)O~


②准备工作(二)

IBMMQ在启动或者程序连接的时候会有各种莫名其妙的问题。主要是连接问题,安全验证问题。连接被拒绝的情况,请检查ip、端口是否配置OK。

安全验证的问题,可以将IBMMQ服务器管理员设置为系统管理员,如下所示,

WebSphere MQ7 实现多点广播_第2张图片


还有就是参照http://blog.csdn.net/xtj332/article/details/14162555这篇文章。



③创建队列管理器QM1,端口1415

右键点击队列管理器菜单,选择新建队列管理器,输入队列管理器名字QM1,下一步-》定义tcp/ip的端口是1415。


④创建队列管理器QM2,端口1416

方法同上。


⑤在QM1中创建传播队列。

在QM1中-》队列,右键点击队列,选择新建本地队列(local queue),需要选择“传播“,和“支持队列分发”


⑥创建发送、接受通道。

在QM2中创建接收通道,QM2->右键点击通道-》新建接收通道-》完成。通道的名字随便起。

在QM1中创建发送通道,QM1-》右键点击通道-》新建发送通道-》通道的名字需要和QM2中的接收通道名字一样(如果不一样会有什么后果,本人没有测试),点击下一步,设置ConnectionName,就是接收方的信息,格式是ip(port),比如我自己在本机测试,因为输入的是 127.0.0.1(1416)。


⑦在QM2中创建三个本地队列A,B,C


⑧在QM1中创建三个远程队列A1,B1,C1,分别指向队列管理器QM2中的队列A,B,C。并且需要选择传播队列,即在第五步中创建的队列。


⑨在QM1中创建主题topic。名字随便起。我们这里假定是test_topic.


⑩在QM1中创建三个Subscrpitions,都订阅test_topic,分别指定对应QM1中的三个远程队列。


至此,完成所有的配置。你可以右击主题,测试发送一个消息,看能否在QM2中的三个队列中看到你发送的东西。


也可以使用java程序来测试。由于需要用程序向MQ服务器发送消息,因此我们需要在队列管理器QM1中创建一个服务器通道,名字是“server_channel”。

测试代码如下:


  try {
            MQTopicConnectionFactory tcf = new MQTopicConnectionFactory();
            tcf.setHostName("127.0.0.1");
            tcf.setTransportType(1);
            tcf.setPort(1415);
            tcf.setChannel("server_channel");
            tcf.setQueueManager("QM1");
            tcf.setBrokerQueueManager("QM1");
            tcf.setCCSID(1381);// 这个是字符集。
            TopicConnection tConn = tcf.createTopicConnection();
            tConn.start();
            TopicSession tSession = tConn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
            Topic topic = tSession.createTopic("test_topic");
            javax.jms.TopicPublisher tPub = tSession.createPublisher(topic);
            Message msg = tSession.createTextMessage("hello, LLY");
            tPub.publish(msg);
            tSession.close();
            tConn.close();
            tPub.close();
        } catch (Throwable e) {
            e.printStackTrace();
        } finally {
        }




/**********************************************************************************************************************************

******************************************************************************************************************************************

我这边遇到的一个问题是:发送消息到主题了,但是QM2中的本地队列没有东西。而在QM1中的传输队列中有消息。原因可能是你的发送方通道或者接收方通道没有打开。如下所示:

WebSphere MQ7 实现多点广播_第3张图片


解决办法:手动启动通道。



你可能感兴趣的:(ibm,websphere)