2009-12-22 69 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