2015-05-01 64 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網絡風暴中飽和,從而導致即使是一個小羣集。

所以簡短的回答是,如果您要定義主題名稱空間的頂部並將其發佈到集羣,那麼您可以動態生成也在該集羣周圍傳播的根節點下的主題。