Интересно, есть ли способ уменьшить объем стандартного кода при инициализации многих очередей / привязок RabbitMQ в SpringBoot?
Следуя подходу, основанному на событиях, мое приложение генерирует около 50 типов событий (это будетразделить на несколько небольших приложений позже, но все же).Каждое событие идет на обмен с типом «тема».Некоторые события потребляются другими приложениями, некоторые события дополнительно потребляются тем же приложением, которое их отправляет.
Давайте рассмотрим этот вариант публикации и самостоятельного использования.
В SpringBoot для каждое событие Мне нужно объявить:
- имя ключа маршрутизации в конфигурации (например, "event.item.purchased")
- имя очереди для использования этого события внутрито же приложение ("queue.event.item.purchased")
- соответствующее поле класса свойств конфигурации или переменная itemPurchasedRoutingKey или константа в коде, в котором хранится имя свойства (например, $ {event.item.purchased})
- для создания очереди (с именем, содержащим имя события), такой как bean-компонент itemPurchasedQueue
- для создания привязки (с именем, содержащим имя события) и имя ключа маршрутизации.например, itemPurchasedBinding, который создается с помощью itemPurchasedQueue.bind (... itemPurchasedRoutingKey)
- RabbitListener для события, с аннотацией, содержащей имя очереди (не может быть определено во время выполнения)
Так -6 мест, где «купленный предмет» упоминается в той или иной форме.Количество шаблонного кода просто убивает меня :) Если есть 50 событий, очень легко ошибиться - при добавлении нового события, вы должны помнить, чтобы добавить его в 6 мест.
В идеале, длякаждое событие, которое я хотел бы:
- указать ключ маршрутизации в конфигурации.Имя очереди может быть построено на нем путем добавления общего префикса (специфичного для приложения).
- использовать некоторую аннотацию или альтернативный RabbitListener, который автоматически объявляет очередь (путем маршрутизации ключ + префикс), связывается с ней и прослушивает события.
Есть ли способ оптимизировать его?Я думал о пользовательских аннотациях, но RabbitListener не любит динамические имена очередей, и Spring Boot не может найти бины для очередей и привязок, если я объявляю их внутри некоторого метода util.Может быть, есть способ объявить все эти вещи в коде, но я не верю в способ Spring, я думаю:)