我有一對集羣在一起的JBoss 5.1服務器作爲容錯JMS服務器。JBoss 5集羣作爲JMS服務器持久性問題
我配置他們使用MySQL數據存儲(與MySQL的持久性,service.xml中啓用羣集設置),我通過定義創建了目的地 - service.xml中的話題的MBean:
<mbean code="org.jboss.jms.server.destination.TopicService" name="jboss.messaging.destination:service=Topic,name=ECM-PRM-Topic" xmbean-dd="xmdesc/Topic-xmbean.xml">
<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
<depends>jboss.messaging:service=PostOffice</depends>
<attribute name="Clustered">true</attribute>
<attribute name="SecurityConfig">
<security>
<role name="ecm-role" write="true" />
<role name="prm-role" read="true" create="true" />
</security>
</attribute>
我的客戶(!J2SE)被連接到該使用JMS服務器:
// Step 1. Create an initial context to perform the JNDI lookup.
initialContext = new InitialContext(p);
// Step 3. Perform a lookup on the Connection Factory
ConnectionFactory cf = (ConnectionFactory)initialContext.lookup("/ClusteredConnectionFactory");
// Step 2. Perfom a lookup on the queue
Destination target = (Destination)initialContext.lookup("/topic/ECM-PRM-Topic");
當事件按照下列順序發生:
- Node1已啓動,Node2已關閉。
- 客戶端連接到JMS,並在主題爲「ECM-PRM-Topic」上創建一個持久訂閱者。
- 客戶端斷開連接,導致持久訂閱。
- 某些其他客戶端發佈關於「ECM-PRM-Topic」主題的消息。
- Node1發生故障。
- Node2上升。
- 某些其他客戶端再次發佈主題爲「ECM-PRM-Topic」的消息。
- 客戶端再次連接到持久訂閱。
- 客戶端斷開連接
- 節點1上升。
- 客戶端再次連接到持久訂閱。
在步驟4中發佈的消息存儲在數據庫中,並且正在等待(我可以在MySQL中看到它們)以便客戶端重新連接。 (沒關係)
在步驟6中啓動的節點不知道該主題上的任何持久訂閱。 (爲什麼??)
在步驟7中發佈的消息立即消失。 (因爲沒有已知的耐用程序,也沒有連接任何客戶端)
當客戶端在步驟8中連接時,它創建一個新的耐用且沒有消息傳遞給它(但是MySQL中仍有消息)。
在步驟10中,客戶端接收來自持久體的所有消息,不包括來自步驟7的消息完全丟失。
我希望100%保證不會丟失任何消息。所有的消息都應該存儲在持久的和MySQL數據庫中,直到客戶端消費。
有什麼建議有什麼不對嗎?
有什麼辦法可以在JBoss中配置XML文件中的持久訂閱(在任何客戶端創建DurableSubscriber之前)?
我使用完整的客戶端代碼HERE
感謝您的信息,這是有用的知道。 – 2010-01-27 22:47:43