Можно ли создать virtualDestitions и CompositeQueue после запуска брокера active-mq? - PullRequest
0 голосов
/ 20 февраля 2020

Рассмотрим следующий сценарий:

Допустим, есть 4 микро-службы, каждый из которых должен иметь свою очередь. Давайте использовать следующий сценарий

  1. Микросервис A -> очередь. A
  2. Микросервис B -> очередь. B.
  3. Микросервис C -> очередь . C
  4. Микросервис D -> очередь.

Теперь все вышеперечисленные микросервисы должны отправлять сообщения в главную очередь, давайте назовем эту очередь . мастер . Когда микросервис A хочет отправить сообщение в микросервис B, он собирается отправить его в главную очередь, главная очередь направит его в микросервис B и так далее. Другими словами, ни одна из микросервисных очередей не знает о очередях друг друга, она знает только о главной очереди, и основная очередь собирается соответствующим образом «маршрутизировать» сообщения.

Теперь проблема заключается в конфигурации выше сценарий. Для XML это будет довольно просто и понятно. Я определю тег <destinationInterceptors> вместе с тегами <compositeQueue> и <forwardOnly> следующим образом:

<destinationInterceptors>
        <virtualDestinationInterceptor>
            <virtualDestinations>
                <compositeQueue name="queue.master" forwardOnly="false">
                    <forwardTo>
                        <queue physicalName="queue.A" />
                        <queue physicalName="queue.B" />
                        <queue physicalName="queue.C" />
                    </forwardTo>
                </compositeQueue>
            </virtualDestinations>
        </virtualDestinationInterceptor>
    </destinationInterceptors>

Также я буду использовать селекторы в тегах, чтобы он мог «отфильтровывать» сообщения и отправлять их соответственно. Приведенный выше сценарий XML работает, как и ожидалось. Но я хочу, чтобы вышеуказанная конфигурация также использовалась во время выполнения программы. В основном я хочу сделать следующее:

  • Брокер собирается запустить

  • Микросервис А запускается, отправит сообщение или веб-запрос к брокеру: «Привет, я встаю, создайте для меня очередь и свяжите ее с главной очередью».

  • Микросервис B запускается и выполняет то же самое.

Пока что я создал брокера с помощью java вызовов API и сконфигурировал виртуальное назначение и составную очередь с помощью java методов и классов следующим образом:

   VirtualDestinationInterceptor virtualDestinationInterceptor = new VirtualDestinationInterceptor();
    CompositeQueue compositeQueue = new CompositeQueue();
    Queue queue = new ActiveMQQueue("queue.A");      // create the child queue of microservice
    compositeQueue.setName("master.queue");         // the master queue . 
    compositeQueue.setForwardTo(Arrays.asList(queue));

    virtualDestinationInterceptor.setVirtualDestinations(new VirtualDestination[]{compositeQueue});
    DestinationInterceptor[] destinationInterceptors = new DestinationInterceptor[]{virtualDestinationInterceptor};
    brokerService.setDestinationInterceptors(destinationInterceptors);

Приведенный выше фрагмент кода находится в компоненте BrokerService, который находится внутри класса @Configuration. Когда приложение springboot (брокер) запускается, оно создает указанный выше child.queue и связывает его с master.queue (все в порядке и отлично), НО я хочу сделать это даже после настройки брокера.

Для этого я создал небольшой класс обслуживания и класс контроллера и поместил вышеуказанный фрагмент кода в метод с именем createQueue(String queueName) и использовал его в своем контроллере. Когда к этой конечной точке обращаются, ничего не происходит. Нет ошибок, нет предупреждений, код выполняется , но не отображается в брокере . Я не могу увидеть вновь созданную очередь, и отправка сообщения в главную очередь не пересылает его в дочернюю очередь.

Возможен ли этот сценарий? Конфигурирование и создание композитных запросов во время выполнения?

1 Ответ

0 голосов
/ 23 февраля 2020

Оказывается, их документация в сети не соответствует. В этом вопросе (https://activemq.apache.org/what-is-the-difference-between-a-virtual-topic-and-a-composite-destination) он прямо заявляет следующее утверждение:

Основное различие между виртуальной топикой c и составным удалением состоит в том, что при Composite Destination Список потребительских направлений - stati c и аппаратный . Принимая во внимание, что с Virtual Topi c во время выполнения новый потребитель или очередь могут быть созданы динамически и добавлены в подписку без перенастройки посредника.

Однако! На этой странице, где присутствуют примечания к выпуску версии 5.9 (https://activemq.apache.org/runtime-configuration), говорится, что определенные теги настраиваются во время выполнения. Документация должна быть последовательной во всем.

ps, только если кто-то захочет это сделать: вы должны добавить <runtimeConfigurationPlugin checkPeriod="1000" /> внутри конфигурации брокера и также использовать этот атрибут start="false" внутри основного тега брокера.

Ссылка выше: https://access.redhat.com/documentation/en-us/red_hat_jboss_a-mq/6.1/html/managing_and_monitoring_a_broker/fmqadminconfigsoloruntime

...