ActiveMQ 和故障转移协议不能自动连接

ActiveMQ and failover protocol not auto connecting

我已经在主从配置中设置了 ActiveMQ 5.4.1 版本(机器上的 JVM 是 1.5,无法更新)。在 2 个单独的端口(61616 和 61617)上有 2 个 运行 的 AMQ 实例 I1 和 I2。他们共享一个共同的 KahaDB。两个实例一起启动,能够锁定 KahaDB 的那个成为主实例。 slave 实例在 KahaDB 上获取锁失败,开始每 10 秒轮询一次,检查 master 是否释放了锁。这工作正常,没有任何问题。

在生产和消费时,使用故障转移协议,使用的连接字符串为
failover:(tcp://I1:61616,tcp://I2:61617)?initialReconnectDelay=10000

消费代码如下

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("failover:(tcp://I1:61616,tcp://I2:61617)?initialReconnectDelay=10000"); Connection connection = connectionFactory.createConnection(); connection.start(); connection.setExceptionListener(this); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("TEST.FOO"); MessageConsumer consumer = session.createConsumer(destination); Message message = consumer.receive(10000); while (message != null) { // Process message and read next message = consumer.receive(10000); }

在上面的 while 循环中,如果一个实例关闭而另一个实例启动,AMQ 消费者会自动打印如下所示的信息消息。
Transport failed, attempting to automatically reconnect due to: java.io.EOFException java.io.EOFException at java.io.DataInputStream.readInt(DataInputStream.java:375) at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:268) at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:192) at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:184) at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:172) at java.lang.Thread.run(Thread.java:619)

但是无法重新连接到 up 实例,后续消费的消息为空。

如果消费者代码为re-运行,则failover:(tcp://I1:61616,tcp://I2:61617)?initialReconnectDelay=10000自动选择up实例。它不会自动重新连接到启动实例的唯一时间是在消耗时,如果实例出现故障。

我是否遗漏了故障转移协议在消费者消费时自动连接到 up 实例的内容?

5.4.1 中存在影响 initialReconnectDelay 的错误。

AMQ-3049:https://issues.apache.org/jira/browse/AMQ-3049

您应该无论如何升级到最新的 5.4.3 以确保您拥有 5 的最多修复。4.x