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

时间:2014-08-06 21:24:01

标签: java jms ibm-mq

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

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

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

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

当我将消息PUT发送到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;
    }

1 个答案:

答案 0 :(得分:3)

应用程序必须本地连接到GET消息。这里的locally意味着应用程序可以从队列管理器中托管的队列中获取消息,应用程序直接连接到该队列管理器中#39;。当运行Beta框的第二个应用程序连接到托管Q1的队列管理器QM2时,它正在获取消息。

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

<强>更新

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

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