【问题标题】:ActiveMQ MessageConsumer behavior on failover故障转移时的 ActiveMQ MessageConsumer 行为
【发布时间】:2020-02-03 08:46:14
【问题描述】:

我有一个应用程序,它在启动时注册 MessageConsumer 对象的静态列表,并在消息进入时在后台执行操作(通过 MessageListener 对象)。我想确保我的代码正确处理故障转移。如果发生故障转移,MessageConsumer 对象会自动转移到故障转移连接还是我需要重新创建消费者?这是代码的相关部分:

public class ActiveMQHandler {
    private final List<MessageConsumer> consumers = new ArrayList<>();
    private final Connection connection; 
    private final Session session;       

    public class ActiveMQHandler() {
         String url = "failover(ssl://...,ssl://...)";
         ActiveMQSslConnectionFactory factory = new ActiveMQSslConnectionFactory(url);
         connection = factory.createConnection();
         connection.start();
         session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
         ...
         MessageConsumer consumer = session.createConsumer(...);
         consumer.setMessageListener(...); // will these still trigger after failover or do I need to recreate the consumer?
         consumers.add(consumer);
         ...
    }

    public void shutdown() {
         // close everything
         ...
     }
}

【问题讨论】:

    标签: java activemq failover


    【解决方案1】:

    当故障恢复时,您需要随着时间的推移制定策略。

    在短时间内发生故障的情况下,现有(或新)消费者将尝试根据传输选项连接到另一个代理。

    这就是为什么不需要任何操作但需要向 URI 添加更多配置的原因。基于您的 ActiveMQ 版本
    有关正确的故障转移选项,请参阅以下文档。 :Failover Transport Reference

    但是,如果故障持续很长时间,情况可能会有所不同。
    这取决于传输选项(maxReconnectAttempts)或您的应用程序做什么。

    这不是你的观点,但这很重要,工厂和连接应该分成全局变量(a.k.a singleton)。工厂和连接对于初始创建来说很昂贵。
    Lessons learned: ActiveMQ, Apache Camel and connection pooling

    请注意,请确保所有代理都具有故障转移传输配置,并且不要忘记在重试连接时添加日志。因为它看起来不起作用。

    【讨论】:

      【解决方案2】:

      故障转移传输的重点是使过程尽可能透明,如果您创建了消费者,那么故障转移传输将在重新连接时重新创建该资源与代理。

      【讨论】:

        猜你喜欢
        • 2019-05-01
        • 2017-02-04
        • 2010-11-06
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-15
        • 1970-01-01
        相关资源
        最近更新 更多