Bei Verwendung von Spring Boot + RabbitMQ möchten Sie möglicherweise vorübergehend das Hören deaktivieren/aktivieren oder die Anzahl der Hörverbraucher während der Entwicklung ändern. Wenn Sie jedes Mal neu starten, ist es Zeitverschwendung, daher habe ich untersucht, um das Hören zu deaktivieren oder einige Konfigurationen zu ändern, ohne zu schließen.
1. Über die Konfiguration des Rabbitmq -Hörens
@Configuration@ConditionalOnClass ({Rabbittemplate.class, Channel.class})@EnableConfigurationProperties (RabbitProperties.Class) @import (RabbitannotationDrivenConFiguration.Class) öffentliche Klasse RabbitAutoConfiguration {...} Die RabbitannotationDrivenConfiguration konzentriert sich hauptsächlich auf die Überwachung der Konfiguration der Fabrik und die Überwachung der Fabrik, aber hier erstellt nur Bohnen und es gibt keine wirkliche Initialisierung.
Analysieren Sie ihn über den Namen der Bean -Klasse in der Konfiguration. Rabbitmqs Zuhören muss von der Hörfabrik erstellt werden
@Bean@Conditionalonmissingbean (name = "RabbitListenerContainerFactory") öffentlich einfacherabbitierenererContainFactory RabbitListenerContainerFactory (SimpleerAbBitSeNerContainerFactoryConfigurer -Konfiguration, ConnectionFactory -Factory -factory -factortory {),) {); configurer.configure (factory, ConnectionFactory); Fabrik zurückgeben;} Da es in der automatischen Konfiguration kein initialisiertes Zuhören gibt, sollte es an anderen Stellen aufgerufen werden. Als ich in die Hörfabrikklasse eintrat, stellte ich fest, dass es die InitializeContainer -Methode (SimpleMessagelistenercontainer -Instanz) gibt. Ich denke, dass die Initialisierung mit dieser Methode zusammenhängen muss, also überprüfe ich, welche Orte aufgerufen werden. Daher habe ich festgestellt, dass der RabbitListenerendPoIntregistry.CreateListenerContainer (RabbitListenerendpoint -Endpunkt, RabbitListenerContainerFactory <Thory -Fabrik -Methode) die Methode zum Erstellen des Containers und der Initialisierung des Hörhörers und der Initialisierung.
/*** Erstellen und starten Sie ein neues {@link messagelistenercontainer} mit der angegebenen Fabrik. * @param endpoint Der Endpunkt zum Erstellen eines {@link messagelistenercontainer}. * @param factory Die zu verwendende {@link rabbitListenContainerFactory}. * @return den {@link messagelistenercontainer}. */Protected Messagelistenercontainer createlistenercontainer (RabbitListenerendpoint -Endpunkt, RabbitListenerContainerFactory <?> Factory) {Messagelistenercontainer Listenercontainer = Fabrik.Createlistencontainer (Endpunkt); if (ListenerContainer -Instanz der Initialisierungbean) {try {((initialisierungsbean) HörerContainer) .AfterProperTieStieSt (); } catch (Ausnahme ex) {werfen Sie eine neue BeanInitializationException aus ("" Message Listener Container nicht initialisieren ", Ex); }} int contatorischerPhase = ListenerContainer.getPhase (); if (Containerphase <Integer.max_value) {// Ein benutzerdefinierter Phasenwert if (this.phase <integer.max_value && this.phase! } this.phase = listenerContainer.getPhase (); } return louserContainer;}Finden Sie weiterhin den Ort, an dem Sie diese Methode aufrufen können. Nachdem ich die Methode von RabbitListenerendPoIntregistrar.AfterProperTieSt () gefunden hatte, stellte ich fest, dass es viele Orte gibt, die sie nennen können.
Schauen wir uns die Nachpropertiesset -Methode an, die sich in der Initialisierungsschnittstelle befindet. Es wird vermutet, dass es sich um die Bean -Initialisierungsmethode handelt, die nach dem Erstellen des Frühlingsbehälters die Bohne erstellt wird. Finden Sie also heraus, wo der RabbitlistenerendPoIntregistrar erstellt wurde. Es stellt sich heraus, dass es sich um ein Privateigentum im RabbitListenerannotationBeanPostProcessor handelt, und der RabbitListenerannotationBeanPostProcessor wird in der automatischen Konfiguration von RabbitbootstrapConfiguration initialisiert, sodass dies die Quelle des initialisierten Zuhörens von Rabbitmq findet
2. Dynamisches Management der Rabbitmq -Überwachung
Wenn ich auf die erste Frage zurückkehre, möchte ich das Anhören von Deaktivieren von MQ dynamisch aktivieren. Daher schaue ich mir zunächst die anfängliche Konfigurationsklasse an. Da es eine Initialisierung gibt, kann es ein relevantes Management geben. Also fand ich die Methoden start () und stop () in der RabbitListenerendPoIntregistry, die auf dem Hörcontainer arbeitet. Der Hauptquellcode ist wie folgt
/*** @return die verwaltete {@link messagelistenercontainer} Instanz (s). */public Collection<MessageListenerContainer> getListenerContainers() { return Collections.unmodifiableCollection(this.listenerContainers.values());} @Overridepublic void start() { for (MessageListenerContainer listenerContainer : getListenerContainers()) { startIfNecessary(listenerContainer); }}/** * Starten Sie das angegebene {@link messagelistenercontainer} Wenn es beim Start gestartet werden sollte oder wenn Start nach dem Start explizit aufgerufen wird. * @see messagelistenerContainer#isAutostartup () */private void startifnegary (MessagelistenerContainer ListenerContainer) {if (this.contexTrefreshed || louseerContainer.isautostartup ()) {HörenerContain.start (); }}@Oversidepublic void stop () {für (messagelistenercontainer listenercontainer: getIliereContainer ()) {listenerContainer.stop (); }} Schreiben Sie einen Controller, injizieren Sie RabbitListenerendPoIntregistry und aktivieren und deaktivieren Sie den Hörvorgang mit start () und stop (). Die RabbitListenerendPoIntregistry -Instanz kann auch den Hörcontainer erhalten und einige Parameter des Zuhörens ändern, wie z. B. die Anzahl der Verbraucher. Der Code ist wie folgt:
Import Java.util.set; Import Javax.annotation.Resource; import org.springframework.amqp.rabbit.Listener.rabbitListenerendpoIntregistry; Import org.springframework.amqp.rabbit.Listener. org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.restcontroller; import com.itopener.framework.resultmap;/*** erstellt von Fuwei.deng am 24. Juli, 2017, 2017, 2017. */@RastController@requestmapping ("Rabbitmq/Listener") RabbitMQController der Öffentlichkeit {@resource private RabbitListenerendPoIntregistry RabbitListenerendPoIntregistry; @RequestMapping ("Stop") public resultMap stop () {RabbitListenerendPoIntregistry.Stop (); return resultMap.buildsuccess (); } @RequestMapping ("start") public resultMap start () {RabbitListenerendPoIntregistry.start (); return resultMap.buildsuccess (); } @RequestMapping ("Setup") public resultMap Setup (int Consumer, int maxconsumer) {set <string> containerIds = RabbitListenerendPoIntregistry.getListenerContainerIds (); Simplemessagelistenercontainer Container = NULL; für (String -ID: ContainerIds) {Container = (SimplemessagelistenerContainer) RabbitListenerendPoIntregistry.getListenerContainer (ID); if (container! Container.SetMaxConcurrentConsumers (Maxconsumer); }} return resultMap.buildsuccess (); }}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.