2016-09-19 5 views
0

Ich habe ActiveMQ Version 5.4.1 (die JVM auf der Maschine ist 1.5 und kann nicht aktualisiert werden) in einer Master-Slave-Konfiguration. Es gibt 2 AMQ-Instanzen I1 und I2, die an 2 separaten Ports (61616 und 61617) ausgeführt werden. Sie teilen eine gemeinsame KahaDB. Beide Instanzen werden zusammen gestartet und je nachdem, was KahaDB sperren kann, wird zum Master. Die Slave-Instanz kann KahaDB nicht sperren und beginnt alle 10 Sekunden abzurufen, um zu überprüfen, ob der Master die Sperre aufgehoben hat. Dies funktioniert ohne Probleme.ActiveMQ und Failover-Protokoll nicht automatisch verbinden

Während Produktion und Konsum wird das Failover-Protokoll verwendet und die Verbindungszeichenfolge ist
failover:(tcp://I1:61616,tcp://I2:61617)?initialReconnectDelay=10000

Der Code Verbraucher als

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); } folgt ist

Innerhalb der while-Schleife oben, wenn ein Wenn die Instanz abstürzt und die andere auftaucht, druckt der AMQ-Consumer automatisch eine unten angezeigte Info-Nachricht aus.
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)

Es ist jedoch nicht möglich, die Verbindung zur up-Instanz wiederherzustellen, und die folgenden Nachrichten, die verbraucht werden, sind null.

Wenn der Consumer-Code erneut ausgeführt wird, wählt failover:(tcp://I1:61616,tcp://I2:61617)?initialReconnectDelay=10000 automatisch die Up-Instanz aus. Die einzige Zeit, in der es sich nicht automatisch wieder mit der Up-Instanz verbindet, ist das Verbrauchen, wenn eine Instanz ausfällt.

Gibt es etwas, das mir fehlt, damit das Failover-Protokoll automatisch eine Verbindung mit der Up-Instanz herstellt, während der Verbraucher konsumiert?

Antwort

0

Es gibt einen Fehler in 5.4.1, der initialReconnectDelay beeinflusst hat.

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

Sie auf die neueste 5.4.3 auf jeden Fall ein Upgrade sollte sicherstellen, dass Sie die meisten Updates für 5.4.x haben

+0

Das funktionierte. Vielen Dank. Ich habe 5.4.3 benutzt –