【问题标题】:Receiving messages from clustered queue in WebSphere MQ从 WebSphere MQ 中的集群队列接收消息
【发布时间】:2014-08-07 21:53:13
【问题描述】:

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

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

物理盒“测试版”: 为端口 1112 定义的 TCP 侦听器 队列管理器名称:QM2 频道名称:“我的频道” 队列名称: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;
    }

【问题讨论】:

  • 这里与 WMQ 集群有些混淆。定义 WMQ 集群时,需要为每个队列管理器定义一个 CLUSRCVR 和一个 CLUSSDR。传输队列 SYSTEM.CLUSTER.TRANSMIT.QUEUE 将被自动创建。您的应用程序不可能只收到一半的消息。您是否在真实配置中进行过测试?
  • @COLINHY:我们已经在真实配置中进行了测试,两个盒子上都定义了 CLUSRCVR 和 CLUSSDR 通道,它们相互指向。您是说连接到 QM1 或 QM2 的应用程序应该接收发送到 Q1 的所有消息吗?这是否意味着消息在 QM1 和 QM2 上的队列 Q1 中复制?

标签: java jms ibm-mq


【解决方案1】:

应用程序必须在本地连接到 GET 消息。 locally 这里的意思是“应用程序可以从托管在应用程序直接连接到的队列管理器中的队列中获取消息”。由于运行Beta 框的第二个应用程序连接到托管Q1 的队列管理器QM2,它正在获取消息。

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

更新

请注意,MQ 集群用于在集群中的队列管理器中的多个集群队列实例之间负载均衡消息。 MQ 集群与高可用性集群不同。在 MQ 集群中,消息会以轮询的方式分发给队列的所有实例(轮询分发是默认的。可以通过开发集群工作负载出口来更改)。

由于工作是对消息进行负载平衡,因此必须为每个集群队列实例设置一个应用程序来处理消息。如果未进行此类设置,则消息将保留在集群队列实例中。

【讨论】:

  • 有没有办法配置系统,以便我的应用程序 Beta 能够接收所有消息,而不管消息放在哪个队列管理器的 Q1 上?我可以将应用程序同时连接到两个队列管理器吗?
  • 请看我上面的更新。如果您只设置一个应用程序来处理来自两个队列管理器中的队列集群队列的消息,那么负载平衡的目的将无法实现。
最近更新 更多