2009-12-22 71 views
3

我有一對集羣在一起的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"); 

當事件按照下列順序發生:

  1. Node1已啓動,Node2已關閉。
  2. 客戶端連接到JMS,並在主題爲「ECM-PRM-Topic」上創建一個持久訂閱者。
  3. 客戶端斷開連接,導致持久訂閱。
  4. 某些其他客戶端發佈關於「ECM-PRM-Topic」主題的消息。
  5. Node1發生故障。
  6. Node2上升。
  7. 某些其他客戶端再次發佈主題爲「ECM-PRM-Topic」的消息。
  8. 客戶端再次連接到持久訂閱。
  9. 客戶端斷開連接
  10. 節點1上升。
  11. 客戶端再次連接到持久訂閱。

在步驟4中發佈的消息存儲在數據庫中,並且正在等待(我可以在MySQL中看到它們)以便客戶端重新連接。 (沒關係)

在步驟6中啓動的節點不知道該主題上的任何持久訂閱。 (爲什麼??)

在步驟7中發佈的消息立即消失。 (因爲沒有已知的耐用程序,也沒有連接任何客戶端)

當客戶端在步驟8中連接時,它創建一個新的耐用且沒有消息傳遞給它(但是MySQL中仍有消息)。

在步驟10中,客戶端接收來自持久體的所有消息,不包括來自步驟7的消息完全丟失。

我希望100%保證不會丟失任何消息。所有的消息都應該存儲在持久的和MySQL數據庫中,直到客戶端消費。

有什麼建議有什麼不對嗎?

有什麼辦法可以在JBoss中配置XML文件中的持久訂閱(在任何客戶端創建DurableSubscriber之前)?

我使用完整的客戶端代碼HERE

回答

1

我們發現,這是不可能的JBoss的正確處理這種情況。

「持久訂閱」創建的事實被廣播給所有節點。如果其中一個節點關閉,它將不會意識到在另一個節點上創建的持久預訂。這會導致上述情況中的數據丟失。

http://community.jboss.org/message/517448#517448

+0

感謝您的信息,這是有用的知道。 – 2010-01-27 22:47:43