如何在 IBM MQ 集群中动态创建订阅?

How to create a subscription on the fly in a IBM MQ cluster?

当我使用此代码作为订阅者时:

MQTopic QMsSubscription = qm.accessTopic("qmstop", "", CMQC.MQTOPIC_OPEN_AS_SUBSCRIPTION, CMQC.MQSO_CREATE);

MQMessage recvQMsMsg = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = MQConstants.MQGMO_WAIT;
gmo.waitInterval = MQConstants.MQWI_UNLIMITED;

QMsSubscription.get(recvQMsMsg, gmo);

发布者代码:

MQTopic QMsPublisher = qm.accessTopic("qmstop", "", CMQC.MQTOPIC_OPEN_AS_PUBLICATION, CMQC.MQOO_OUTPUT);
MQMessage sendQMsMsg = new MQMessage();
sendQMsMsg.writeString(thisQM);
QMsPublisher.put(sendQMsMsg);

这些代码在具有一个队列管理器的一台机器上运行良好,但是当我在具有多个队列管理器的集群中使用这些代码时,消息不会发送到其他机器。

如何在集群中动态创建主题字符串?

通常,您不会在 MQ 中使用像 qmstop 这样的主题。这样做的原因是 MQ 对其自身的许多操作使用 Pub/Sub,任何可以在主题树顶部发布或订阅的人都可以注入或订阅 MQ 内部 pub/sub 消息。

它在 MQ 中的工作方式是您首先设计一个主题命名空间。通常这有一个根节点,主题树的其余部分可以是宽而浅、高而深或稀疏。但是,总是至少有一个根节点。

一旦你有了根节点,你就可以为它定义一个主题对象。例如,设想以下主题命名空间:

Items
   Produce
      Fruits
         Apples
         Bananas
         Cherries
      Vegetables
         Asparagus
         Beets
         Carrots

如果您定义了一个指向项目的主题对象,您可以将它公布到集群。一旦定义了主题对象,您就可以挂起访问控制列表,以便您可以定义谁可以发布和谁可以订阅。

有权发布或订阅 Items 的人随后可以动态创建任何以 Items 为根的主题字符串。例如,他们可以发布或订阅 Items/Produce。由于 Items 已通告到集群,动态创建的 Items/Produce 将通过集群分发。

同样,如果定义了指向 Items/Produce/FruitItems/Produce/Vegetables 的主题对象并将其通告到集群,您可以授权人们使用这些对象。在这种情况下,仅授权 Items/Produce/Fruit 的人无法发布或订阅 Items/Produce/Vegetables。但是,如果他们想发布到 Items/Produce/Fruit/Apples/Gala,他们将能够动态创建该主题并通过集群分发。

你做的不是想要的是让QMgrs发布all 他们在整个集群中的主题,因为他们会在系统主题上获得彼此的内部流量。除了消耗 QMgr 上的资源外,网络可能会因巨大的网络风暴而饱和,这甚至会导致一个小集群。

所以简短的回答是,如果您要定义主题命名空间的顶部并将其通告到集群,那么您可以在该根节点下方动态生成主题,这些主题也会在集群中传播。