Spring Boot + ActiveMQ программно подписываются на темы на лету - PullRequest
0 голосов
/ 14 мая 2018

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

  1. Иметь класс слушателя, который содержит список названий тем String и периодически запускатьчерез все эти темы он должен быть подписан и выполнять блокировку jmsTemplate.receiveAndConvert(topicName) для каждого (возможно, делегирование самой операции блокировки рабочему пулу).Подписка / отмена подписки на тему так же проста, как удаление названия темы из списка.
  2. Иметь класс фабрики, который будет создавать новый прослушиватель для каждой темы, на которую должно подписаться приложение, используяметод вроде:

    public MessageListenerContainer createListener(String topic) {
      DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
      container.setConnectionFactory(connectionFactory());
      container.setDestinationName(topic);
      container.setMessageListener(new MyListenerClass());
      return container;
    

    }

Второй вариант мне кажется более элегантным, но я не уверен в жизненном цикле слушателей.Я просмотрел немного исходного кода для модулей весенней загрузки jms и activemq и заметил, что DefaultMessageListenerContainer имеет методы initialize() и start(), хотя я не уверен, как / если мне нужно использовать их, как единственный способ, которым я могнайти MessageListenerContainer, строящийся таким образом, как объявление Bean.Кроме того, когда вы отписываетесь от темы, поэтому хотите уничтожить связанный с ней контейнер слушателя, нужно ли делать что-то еще, кроме вызова метода stop(callback)?

Является ли мое понимание JMS / ActiveMQ и его Springправильная интеграция в том, что нет более простого способа добиться этого?Правильный ли мой подход?

1 Ответ

0 голосов
/ 14 мая 2018

ИМХО, пока вы

  • получаете соединение Factory из пружины ( не a PooledConnectionFactory one)
  • , правильно звоните initialise() и start() при подписке и stop() отписаться
  • не ожидать повторной доставки сообщения в случае исключения

все должно быть хорошо при втором подходе

...