2013-03-07 36 views
0

我正在使用Glassfish 3.1.2,並設置了一個節點和兩個實例的集羣。Glassfish - 如何將JMS消息廣播到羣集中的所有實例?

我的應用程序中有一個消息驅動bean,它訂閱了我部署到羣集的主題。

當我向該主題發佈消息時,我希望這兩個實例都能收到該消息。

但是,在實踐中,我發現只有一個實例接收到消息。

我相信我遇到了一個名爲「共享訂閱」 http://docs.oracle.com/cd/E18930_01/html/821-2438/gjzpg.html#MQAGgjzpg

的功能(該功能默認啓用)功能說,與同一個客戶端ID集羣中的bean是共享,並有效地僅一個訂閱。

它說,默認情況下,MDB的客戶端ID是它的名稱,這意味着我的兩個實例都使用相同的客戶端ID。

因此,除了完全禁用此功能外,我想知道是否可以設置MDB,以便每個實例使用不同的客戶端ID進行訂閱?這似乎有點棘手,因爲兩個實例都使用相同的WAR文件。我認爲你可以在註釋中設置客戶端ID,但我不確定這是否可以在運行時更改...

回答

0

我不確定爲什麼要完全禁用此功能。在您提供的鏈接中,它明確指出您可以根據ActivationSpec/MDB進行配置。所以據我瞭解,它只會影響你手邊的MDB。

對於MDB,請將ActivationSpec屬性useSharedSubscriptionInClusteredContainer設置爲false。正如 一樣,使用與其他ActivationSpec屬性相同的方式執行此操作,在MDB本身或部署描述符 ejb-jar.xml或glassfish-ejb-jar.xml中使用 批註。

但是,您當然可以在運行時動態地在連接上設置客戶端ID。請注意,您可能必須自己處理JMS連接,而不是依賴容器管理的功能。

http://docs.oracle.com/javaee/6/api/javax/jms/Connection.html#setClientID(java.lang.String)

+0

謝謝,但我不知道怎麼去訪問MDB的底層連接,也沒怎麼設置的ActivationSpec屬性(可以這樣使用註釋做了什麼?)我BTW現在的做法它的作用是使用下面的註解:@ActivationConfigProperty(propertyName =「clientID」,propertyValue =「$ {com.sun.aas.instanceName}」)這似乎爲每個實例設置了不同的客戶端ID。 – Darren 2013-03-08 14:29:02