Поведение ActiveMQ MessageConsumer при отработке отказа - PullRequest
0 голосов
/ 05 октября 2019

У меня есть приложение, которое регистрирует статический список объектов 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
         ...
     }
}

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Вам понадобится стратегия со временем, когда сбои восстановятся.

В случае сбоя, произошедшего в течение короткого времени, существующий (или новый) потребитель попытается подключиться к другому брокеру в соответствии с вариантом транспорта.

То естьпричина, по которой никаких действий не требуется, но необходимо добавить дополнительную конфигурацию в URI. на основе вашей версии ActiveMQ
Обратитесь к следующему документу для правильной настройки отработки отказа. : Отказоустойчивый транспортный справочник

Однако, если сбой сохраняется длительное время, это может быть другой ситуацией.
Это зависит от варианта транспорта (maxReconnectAttempts) или от того, что делает ваше приложение.

Это не ваша точка зрения, но это важно, фабрика и соединение должны быть разделены на глобальные переменные (иначе говоря, синглтон). Фабрика и соединение дороги для первоначального создания.
Извлеченные уроки: ActiveMQ, Apache Camel и пул соединений

Обратите внимание, что вы убедитесь, что у всех брокеров есть конфигурация аварийного транспорта и не забылидобавить журнал при повторной попытке подключения. Потому что это похоже на работу.

0 голосов
/ 06 октября 2019

Смысл транспорта аварийного переключения состоит в том, чтобы сделать процесс настолько прозрачным, насколько это возможно. Да, если вы создали потребителя, то транспорт аварийного переключения будет воссоздавать этот ресурс с посредником при повторном подключении.

...