ActiveMQ failover transport options not working as expected

1.6k views Asked by At

I would like to use the ActiveMQ failover transport as described in https://activemq.apache.org/failover-transport-reference.html.

The default "retry forever" failover options work as expected.

However, since "forever" is sometimes too long, I tried to set some options in order to terminate the retry earlier.

For example, at startup I would like to terminate the application immediately if the connection to a broker can not be established at the first attempt.

I tried the simplest option:

failover:tcp://localhost:61616?startupMaxReconnectAttempts=0

but to my surprise, the retry goes on "forever" nevertheless.

I have tried many other combinations of options, like

failover:tcp://localhost:61616?startupMaxReconnectAttempts=0&maxReconnectDelay=10&maxReconnectAttempts=0&timeout=10

but without the desired result.

What am I doing wrong? How can I configure the failover transport such that it will terminate reconnection attempts at startup if a broker is not available?

I am using ActiveMQ version 5.15.9 (https://hub.docker.com/r/rmohr/activemq) and the Apache.NMS.ActiveMQ lib version 1.8.

The relevant code snippet is

var factory = new ConnectionFactory(connectionString);
var connection = factory.CreateConnection();
var session = connection.CreateSession(); // hangs here
2

There are 2 answers

0
Benjamin Batistic On

There is Apache.NMS.ActiveMQ specific URI configuration: https://activemq.apache.org/components/nms/providers/activemq/uri-configuration which is not consistent with https://activemq.apache.org/failover-transport-reference.html, which brings a lot of confusion.

Following the NMS documentation I came up with a working solution:

failover:(tcp://localhost:61616)?transport.startupMaxReconnectAttempts=1
  • the composite URI must be in parentheses: failover:(tcp://localhost:61616)?... and not failover:tcp://localhost:61616?....
  • transport specific options must be prefixed with transport.
  • option transport.startupMaxReconnectAttempts=0 corresponds to infinite retries
0
Aidos On

I don't know if this is correct but after trying to do a lot of reading, the only mechanism I found to make this work for myself using NMS 2.0.0 and NMS.ActiveMq 2.0.1 was to use the following connection string (when running in docker):

activemq:failover:(activemq:tcp://localhost:61616,activemq:tcp://localhost:61617,activemq:tcp://localhost:61618)

Using just the failover: prefix was causing an exception to be thrown similar to: Apache.NMS.NMSConnectionException: No IConnectionFactory implementation found for connection URI: