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

时间:2015-05-01 11:23:48

标签: java jms ibm-mq

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

class Product(model.Models):

    def saveProduct(self, product):
        if self.validateProduct(product):
            product.save()


    def validateProduct(self, product):
        try:
            product.full_clean()
        except ValidationError:
            return False

        return True

以及发布商的此代码:

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

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

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

1 个答案:

答案 0 :(得分:0)

通常,您不会在MQ中使用qmstop之类的主题。原因是MQ使用Pub / Sub进行许多自己的操作,任何可以在主题树顶部发布或订阅的人都可以注入或订阅MQ内部发布/订阅消息。

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

获得根节点后,为其定义主题对象。例如,假设以下主题命名空间:

Items
   Produce
      Fruits
         Apples
         Bananas
         Cherries
      Vegetables
         Asparagus
         Beets
         Carrots

如果定义指向Items的主题对象,则可以将其通告给群集。定义主题对象后,您可以挂起访问控制列表,以便您可以定义谁可以发布以及谁可以订阅。

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

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

您所做的 想让QMgrs在整个群集中发布 所有 他们的主题,因为他们会然后互相让对方'系统主题的内部流量。除了吸收QMgr上的资源之外,网络可能会从巨大的网络风暴中饱和,这甚至会导致一个小型集群。

简而言之,如果您要定义主题命名空间的顶部并将其通告给群集,则可以在该根节点下方动态生成主题,该主题也会在群集中传播。