При использовании Spring Boot + Rabbitmq вы можете временно отключить/включить прослушивание или изменить количество потребителей прослушивания во время разработки. Если вы перезагружаете каждый раз, это пустая трата времени, поэтому я учился, чтобы позволить деактивировать прослушивание или изменить некоторые конфигурации без выключения.
1. О конфигурации прослушивания Rabbitmq
@Configuration@CondentalOnClass ({RabbitTemplate.class, Channel.class})@enableconfigurationProperties (rabbitproperties.class) @Import (RabbitannotationDrivenconfiguration.class) Public Class RabbitAutoConfiguration {...} Rabbitannotationdrivenconfiguration в основном фокусируется на мониторинге конфигурации завода и мониторинг фабрики, но здесь просто создает бобы, и нет реальной инициализации.
Через имя класса бобов в конфигурации проанализируйте его. Прослушивание Rabbitmq должно быть создано на заводе прослушивания, так что найдите фабрику прослушивания SimpleRabbitListenerContainerFactory
@Bean@ConditionalOnMissingBean(name = "rabbitListenerContainerFactory")public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory( SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configururer.configure (Factory, ConnectionFactory); вернуть фабрику;} Поскольку в автоматической конфигурации нет инициализированного прослушивания, ее следует вызывать в других местах. Вступив в класс завода прослушивания, я обнаружил, что существует метод инициализации (экземпляр SimpleMessageListenerContainer). Я предполагаю, что инициализация должна быть связана с этим методом, поэтому я проверяю, какие места называются, поэтому я обнаружил, что RabbitlistenerendPointregistry.createlistenerContainer (RabbitListenerendPoint конечная точка, метод RabbitListenerContainerFactory <?> Factory) имеет код для создания контейнера и инициализации прослушивания.
/*** Создать и запустить новый {@link messagelistenercontainer}, используя указанную фабрику. * @param endpoint конечная точка, чтобы создать {@link messagelistenercontainer}. * @param factory {@link rabbitlistenercontainerfactory} для использования. * @return the {@link messagelistenercontainer}. */Защищенный MessagelistenerContainer CreateListenerContainer (RabbitListenerEndPoint Endpoint, RabbitListenErcontainerFactory <?> Factory) {MessageListenerContainer SluseerContainer = factory.createListenErcontainer (конечная точка); if (alingercontainer экземпляр инициализации bean) {try {((инициализация bean) слушания). afterpropertiesset (); } catch (Exception ex) {бросить новое BeaninitializationException («Не удалось инициализировать контейнер прослушивателя сообщений», Ex); }} int containerphase = alingercontainer.getphase (); if (containerphase <Integer.max_value) {// Пользовательское значение фазы if (this.phase <integer.max_value && this.phase! } this.phase = listenercontainer.getphase (); } return alingercontainer;}Продолжайте найти место, чтобы назвать этот метод. Найдя метод RabbitlistenerendPointregistrar.afterPropertiesset (), я обнаружил, что есть много мест, где можно назвать его.
Давайте посмотрим на метод Afterpropertiesset, который находится в интерфейсе инициализирующихся. Угадается, что это должен быть метод инициализации бобов, который будет вызван после того, как пружинный контейнер создает фасоль, поэтому найдите, где был создан RabbitListenerendEntRegistrar. Оказывается, что это частная собственность в Rabbitlistenerannotationbeanpostprocessor, а Rabbitlistenerannotationbeanpostprocessor инициализируется в автоматической конфигурации Rabbitbootstrapconfiguration, так что это находит источник инициализированного прослушивания Rabbitmq
2. Динамическое управление мониторингом RabbitMQ
Возвращаясь к первоначальному вопросу, я хочу динамически включить прослушивание отключения MQ, поэтому я сначала посмотрю на начальный класс конфигурации. Поскольку существует инициализация, может быть соответствующее управление. Поэтому я нашел методы Start () и Stop () в RabbitlistenerendPointregistry, которая работает на контейнере для прослушивания. Основной исходный код заключается в следующем
/*** @return the Managed {@link messagelistenercontainer} экземпляр. */public Collection <sssageListenerContainer> getListenErcontainers () {return Collections.unmodifiablecollection (this.listenercontainers.values ());} @OverridePublic void Start () {for (messagelistenerContainer stirlercontainerer: getListenErcontainerers () {startIfneContainerer) (stustRecressOnerary; }}/** * Начните указанный {@link messagelistenercontainer}, если его следует запустить * при запуске или когда запуск явно называется после запуска. * @see messagelistenercontainer#isautostartup () */private void startifnecessary (messagelistenercontainer sluseercontainer) {if (this.contextrefreshed || usingercontainer.isautostartup ()) {userercontainer.start (); }}@OverridePublic void stop () {for (messagelistenercontainer hellessercontainer: getListenerContainers ()) {alingercontainer.stop (); }} Напишите контроллер, инъекция RabbitlistenerendPointregistry и включите и отключите операцию прослушивания, используя start () и stop (). Экземпляр RabbitlistenerendPointregistry также может получить контейнер для прослушивания и изменить некоторые параметры прослушивания, такие как количество потребителей. Код заключается в следующем:
Импорт java.util.set; import javax.annotation.resource; import org.springframework.amqp.rabbit.listener.rabbitlistenerendpointregistr org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; import com.itopener.framework.resultmap;/** * Создан Fuwei.deng 24 июля 2017 г. */@@@@@@@restcontroler@requestmapping (rab -abritemem@referppoppaymer@referpappapper (rabbitm.deng. Rabbitmqcontroller {@resource private rabbitlistenerendpointregistry rabbitlistenerendpointregistry; @Requestmapping ("Stop") public resultmap stop () {rabbitlistenerendpointregistry.stop (); вернуть resultmap.buildSuccess (); } @RequestMapping ("start") public resultMap start () {RabbitListenerEndPointRegistry.Start (); вернуть resultmap.buildSuccess (); } @RequestMapping ("setup") public resultMap setup (int consumer, int maxconsumer) {set <string> containerids = RabbitListenerEndPointRegistry.getListenErconTainerIds (); SimpleMessageListenErcontainer Container = null; для (String Id: Containerids) {container = (SommereMessageListenerContainer) RabbitListenerEndPointRegistry.getListenerContainer (id); if (container! = null) {container.setConcurrentConsumers (потребитель); intainer.setMaxConcurrentConsumers (maxConsumer); }} return resultmap.buildSuccess (); }}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.