Java 从WebSphere MQ中的群集队列接收消息

Java 从WebSphere MQ中的群集队列接收消息,java,jms,ibm-mq,Java,Jms,Ibm Mq,我正在寻找一些关于如何设置一个在多个队列管理器上侦听集群队列的应用程序的指导。以下是我们当前的设置: 物理框“Alpha”: 为端口1111定义的TCP侦听器 队列管理器名称:QM1 频道名称:“MyChannel” 队列名称:Q1 物理框“Beta”: 为端口1112定义的TCP侦听器 队列管理器名称:QM2 频道名称:“MyChannel” 队列名称:Q1 外部客户端应用程序连接到端口1111上物理盒Alpha上的QM1 当我将消息放在Q1上时,由于集群设置,每秒钟的消息都放在QM1上的Q1

我正在寻找一些关于如何设置一个在多个队列管理器上侦听集群队列的应用程序的指导。以下是我们当前的设置:

物理框“Alpha”: 为端口1111定义的TCP侦听器 队列管理器名称:QM1 频道名称:“MyChannel” 队列名称:Q1

物理框“Beta”: 为端口1112定义的TCP侦听器 队列管理器名称:QM2 频道名称:“MyChannel” 队列名称:Q1

外部客户端应用程序连接到端口1111上物理盒Alpha上的QM1

当我将消息放在Q1上时,由于集群设置,每秒钟的消息都放在QM1上的Q1或QM2上的Q1上

当另一个应用程序连接到端口1112上物理盒Beta上的QM2时,它只接收发送到Q1的消息的一半,因为它不同时监视这两个队列管理器

是否有一种方法连接到两个队列管理器,以便我的第二个应用程序接收放置在Q1上的所有消息,而不管它正在监视哪个队列管理器?

我们使用以下代码通过JMS进行连接:

 public static ConnectionFactory createConnectionFactory(final ConnectionString connectionString) throws JMSException {
        MQConnectionFactory cf = new MQConnectionFactory();
        cf.setHostName(connectionString.getHost());
        cf.setPort(connectionString.getPort());
        cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);
                cf.setClientReconnectOptions(WMQConstants.WMQ_CLIENT_RECONNECT_Q_MGR);
        cf.setQueueManager(connectionString.getQueueManager());
        cf.setChannel(connectionString.getChannel());

        return cf;
    }

应用程序必须在本地连接才能获取消息。这里的
本地
表示“应用程序可以从应用程序直接连接到的队列管理器中托管的队列中获取消息”。当运行
Beta
box的第二个应用程序连接到托管Q1的队列管理器QM2时,它正在获取消息

您可以在
Alpha
框中运行第二个应用程序的另一个实例,该应用程序连接到QM1以从Q1获取消息

更新

请注意,MQ cluster用于在集群中的队列管理器中的多个集群队列实例之间平衡消息。MQ群集与高可用性群集不同。在MQ中,集群消息将以循环方式分发到队列的所有实例(默认为循环分发。可通过开发集群工作负载出口将其更改为)


由于任务是负载平衡消息,因此必须为每个集群队列实例设置一个应用程序来处理消息。如果没有进行这样的设置,那么消息将保留在集群队列实例中。

这里有一些与WMQ集群的混淆。定义WMQ集群时,需要为每个队列管理器定义一个CLUSRCVR和一个CLUSSDR。传输队列SYSTEM.CLUSTER.TRANSMIT.queue将自动创建。应用程序不可能只接收一半的消息。您在真实配置中进行过测试吗?@COLINHY:我们在真实配置中进行了测试,两个框上定义了相互指向的CLUSRCVR和CLUSSDR通道。您是说连接到QM1或QM2的应用程序应该接收发送到Q1的所有消息吗?这是否意味着消息会在QM1和QM2上跨队列Q1复制?是否有办法配置系统,以便我的应用程序Beta能够接收所有消息,而不管消息放在哪个队列管理器的Q1上?我可以同时将应用程序连接到两个队列管理器吗?请参阅上面的更新。如果只将一个应用程序设置为在两个队列管理器中处理来自队列群集队列的消息,则负载平衡的目的将无法实现。