如何在 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/Fruit
和 Items/Produce/Vegetables
的主题对象并将其通告到集群,您可以授权人们使用这些对象。在这种情况下,仅授权 Items/Produce/Fruit
的人无法发布或订阅 Items/Produce/Vegetables
。但是,如果他们想发布到 Items/Produce/Fruit/Apples/Gala
,他们将能够动态创建该主题并通过集群分发。
你做的不是想要的是让QMgrs发布all 他们在整个集群中的主题,因为他们会在系统主题上获得彼此的内部流量。除了消耗 QMgr 上的资源外,网络可能会因巨大的网络风暴而饱和,这甚至会导致一个小集群。
所以简短的回答是,如果您要定义主题命名空间的顶部并将其通告到集群,那么您可以在该根节点下方动态生成主题,这些主题也会在集群中传播。
当我使用此代码作为订阅者时:
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/Fruit
和 Items/Produce/Vegetables
的主题对象并将其通告到集群,您可以授权人们使用这些对象。在这种情况下,仅授权 Items/Produce/Fruit
的人无法发布或订阅 Items/Produce/Vegetables
。但是,如果他们想发布到 Items/Produce/Fruit/Apples/Gala
,他们将能够动态创建该主题并通过集群分发。
你做的不是想要的是让QMgrs发布all 他们在整个集群中的主题,因为他们会在系统主题上获得彼此的内部流量。除了消耗 QMgr 上的资源外,网络可能会因巨大的网络风暴而饱和,这甚至会导致一个小集群。
所以简短的回答是,如果您要定义主题命名空间的顶部并将其通告到集群,那么您可以在该根节点下方动态生成主题,这些主题也会在集群中传播。