java - JBoss 5集群作为JMS服务器的持久化问题

标签 java jboss jms jboss-messaging

我有一对 JBoss 5.1 服务器集群在一起充当容错 JMS 服务器。

我将它们配置为使用 MySQL 数据存储(在 mysql-persistence-service.xml 中启用了集群设置),我通过定义在 destinations-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. 节点 1 已启动,节点 2 已关闭。
  2. 客户端连接到 JMS 并创建主题为“ECM-PRM-Topic”的持久订阅者。
  3. 客户端断开连接,离开持久订阅。
  4. 其他一些客户端发布了主题为“ECM-PRM-Topic”的消息。
  5. 节点 1 出现故障。
  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

最佳答案

我们发现 JBoss 无法正确处理此类情况。

“持久订阅”创建的事实被广播到所有节点。如果其中一个节点发生故障,它将不会知道在另一个节点上创建的持久订阅。在上述情况下会导致数据丢失。

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

关于java - JBoss 5集群作为JMS服务器的持久化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1947363/

相关文章:

java - 什么是 JPA 提供程序?

Java 通用构建器

java - 在性能测试中应该使用哪个 FOSS Java 应用程序?

Spring JmsTemplate 和 Apache ActiveMQ,为什么有这么多连接?

java - JMS QueueSender 线程安全吗?

Java JDK 问题或其他问题

java - 数组中 TextEdit 中的参数不正确

java - Jboss 7生产服务器端口设置

java - Spring MVC 链接

oracle11g - 从 IBM MQ 迁移到 javax.jms.* (Weblogic)