【问题标题】:How to create a subscription on the fly in a IBM MQ cluster?如何在 IBM MQ 集群中动态创建订阅?
【发布时间】:2018-07-10 00:26:45
【问题描述】:

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

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);

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

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

【问题讨论】:

标签: java jms ibm-mq


【解决方案1】:

通常,您不会在 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 在集群中发布所有他们的主题,因为他们会然后获取彼此在系统主题上的内部流量。除了吸收 QMgr 上的资源外,网络可能会因巨大的网络风暴而饱和,甚至会导致小型集群。

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

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多