我想使用 ActiveMQ 故障转移传输,如 https://activemq.apache.org/failover-transport-reference.html中所述。
默认的“永远重试”故障转移选项按预期工作。
但是,由于“永远”有时太长,我尝试设置一些选项以提前终止重试。
例如,在启动时,如果第一次尝试无法建立与代理的连接,我想立即终止应用程序。
我尝试了最简单的选择:
failover:tcp://localhost:61616?startupMaxReconnectAttempts=0
但令我惊讶的是,重试仍然“永远”进行。
我尝试了许多其他选项组合,例如
failover:tcp://localhost:61616?startupMaxReconnectAttempts=0&maxReconnectDelay=10&maxReconnectAttempts=0&timeout=10
但没有达到预期的结果。
我做错了什么?如何配置故障转移传输,以便在代理不可用时终止启动时的重新连接尝试?
我正在使用 ActiveMQ 版本 5.15.9 (https://hub.docker.com/r/rmohr/activemq) 和 Apache.NMS.ActiveMQ lib 版本 1.8。
相关代码片段是
var factory = new ConnectionFactory(connectionString);
var connection = factory.CreateConnection();
var session = connection.CreateSession(); // hangs here
有 Apache.NMS.ActiveMQ 特定的 URI 配置:https://activemq.apache.org/components/nms/providers/activemq/uri-configuration 与 https://activemq.apache.org 不一致/failover-transport-reference.html,这带来了很多混乱。
根据 NMS 文档,我想出了一个可行的解决方案:
failover:(tcp://localhost:61616)?transport.startupMaxReconnectAttempts=1
failover:(tcp://localhost:61616)?...
而不是 failover:tcp://localhost:61616?...
。transport.
transport.startupMaxReconnectAttempts=0
对应无限重试我不知道这是否正确,但在尝试进行大量阅读后,我发现使用 NMS 2.0.0 和 NMS.ActiveMq 2.0.1 为自己工作的唯一机制是使用以下连接字符串(在docker中运行时):
activemq:failover:(activemq:tcp://localhost:61616,activemq:tcp://localhost:61617,activemq:tcp://localhost:61618)
仅使用
failover:
前缀会导致抛出类似于以下内容的异常:Apache.NMS.NMSConnectionException: No IConnectionFactory implementation found for connection URI: