2015-05-01 81 views
2

当我使用此代码为订户:如何在IBM MQ集群中实时创建订阅?

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

这些代码工作以及在一台机器与一个队列管理器,但是当我在集群中使用这些代码与许多队列管理器消息不发送到其他机器。

如何在集群中实时创建主题字符串?

+0

您需要告诉WMQ该主题应该是类型集群。但这并不是“即时”。 http://www-01.ibm.com/support/docview.wss?uid=swg27016146#3 –

回答

0

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

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

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

Items 
    Produce 
     Fruits 
     Apples 
     Bananas 
     Cherries 
     Vegetables 
     Asparagus 
     Beets 
     Carrots 

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

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

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

你做什么希望的就是有QMgrs发布所有其主题在集群中,因为他们会再得到系统主题彼此的内部通信。除了吸取QMgr上的资源之外,网络可能会从ginormous网络风暴中饱和,从而导致即使是一个小群集。

所以简短的回答是,如果您要定义主题名称空间的顶部并将其发布到集群,那么您可以动态生成也在该集群周围传播的根节点下的主题。