Рассмотрим следующий сценарий:
Допустим, есть 4 микро-службы, каждый из которых должен иметь свою очередь. Давайте использовать следующий сценарий
- Микросервис A -> очередь. A
- Микросервис B -> очередь. B.
- Микросервис C -> очередь . C
- Микросервис 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)
и использовал его в своем контроллере. Когда к этой конечной точке обращаются, ничего не происходит. Нет ошибок, нет предупреждений, код выполняется , но не отображается в брокере . Я не могу увидеть вновь созданную очередь, и отправка сообщения в главную очередь не пересылает его в дочернюю очередь.
Возможен ли этот сценарий? Конфигурирование и создание композитных запросов во время выполнения?