Lorsque vous utilisez Spring Boot + RabbitMQ, vous souhaiterez peut-être temporairement désactiver / activer l'écoute, ou modifier le nombre de consommateurs d'écoute pendant le développement. Si vous redémarrez à chaque fois, c'est une perte de temps, j'ai donc étudié pour permettre la désactivation de l'écoute ou modifier certaines configurations sans arrêter.
1. À propos de la configuration de l'écoute Rabbitmq
@ Configuration @ conditionalOnClass ({labbitTemplate.class, channel.class}) @ perteConfigurationProperties (RabbitProperties.class) @Import (RabbitannotationDrivenConfiguration.class) Class public Rabbitautoconfiguration {...} RabbitannotationDrivenConfiguration se concentre principalement sur la surveillance de la configuration de l'usine et la surveillance de l'usine, mais voici simplement la création de haricots, et il n'y a pas de véritable initialisation.
Grâce au nom de classe Bean dans la configuration, analysez-le. L'écoute de Rabbitmq doit être créée par l'usine d'écoute, alors trouvez l'usine d'écoute SimplerabbitListeNerConainerFactory
@ Bean @ conditionalonMissingBean (name = "RabbitListeNerContainerFactory") public SimplerabbitListenerConainerFactory RabbitListeNerConainerFactory (SimplerabbitListeContainerFactoryConfigurer Configurer, connexion ConnectionFactory) SimplerAbbitListeNerConainerFactory (); configurer.Configure (Factory, ConnectionFactory); Retour usine;}
Puisqu'il n'y a pas d'écoute initialisée dans la configuration automatique, elle doit être appelée à d'autres endroits. En entrant dans la classe d'usine d'écoute, j'ai constaté qu'il existe la méthode InitizEContainer (SimpleMessageListenerContainer Instance). Je suppose que l'initialisation doit être liée à cette méthode, donc je vérifie quels endroits sont appelés, donc j'ai constaté que le RabbitListeneRendPointregistry.CreateEListERContainer (RabbitListenendPoint Point, RabbitListenerContainerFactory <?> Factory) a le code pour créer le conteneur et l'initialisation d'écoute.
/ ** * Créer et démarrer une nouvelle {@Link MessageListenerContainer} en utilisant l'usine spécifiée. * @Param Endpoint le point de terminaison pour créer un {@Link MessageListenerContainer}. * @param usine the {@link labbitLissenerContainerFactory} à utiliser. * @return le {@Link MessageListenerContainer}. * / MessageListenerConainer protégé CreateListenterContainer (RabbitListeneRendPoint Point, RabbitListeNerConainerFactory <?> Factory) {MessageListrenerConainer auTrederContainer = Factory.CreateEListERContoniner (point final); if (écouteur de couvre-écouteurs de l'initialisation de laBean) {try {((initializingBean) écoutère de contracture) .afterProperTesTet (); } catch (exception ex) {throw new BeaninItializationException ("Échec de l'initialisation du conteneur d'écouteur de messages", ex); }} int contenerphase = eventicerContainer.getphase (); if (contenerphase <nteger.max_value) {// une valeur de phase personnalisée if (this.phase <nteger.max_value && this.phase! = contenerphase) {lancez new illégalstateException ("Mismatch de phase rencontré entre les définitions d'usine de conteneurs:" + this.phase + "vs" + contenerphase); } this.phase = evercerContainer.getphase (); } return écouter un counner;}Continuez à trouver l'endroit pour appeler cette méthode. Après avoir trouvé la méthode RabbitListederendPointregistrar.AfterProperTesTet (), j'ai constaté qu'il y avait de nombreux endroits pour l'appeler.
Jetons un coup d'œil à la méthode AfterPropertiseSet, qui se trouve dans l'interface InitializingBean. Il est deviné que ce devrait être la méthode d'initialisation du bean qui sera appelée après que le conteneur à ressort a créé le haricot, alors trouvez où le lapinListeneRendPoitregistrar a été créé. Il s'avère qu'il s'agit d'une propriété privée dans le RabbitListenerannotationBeanPostProcessor, et le lapinListenerannotationBeanPostProcessor est initialisé dans la configuration automatique de Rabbitbootstrap Concuguration, donc cela trouve la source de l'écoute initialisée de Rabbitmq
2. Gestion dynamique de la surveillance du lapin
Pour en revenir à la question initiale, je veux activer dynamiquement l'écoute de Disable MQ, donc je regarde d'abord la classe de configuration initiale. Puisqu'il y a une initialisation, il peut y avoir une gestion pertinente. J'ai donc trouvé les méthodes start () et stop () dans le RabbitListeterendPoitregistry, qui fonctionne sur le conteneur d'écoute. Le code source principal est le suivant
/ ** * @return L'instance gérée {@link messageListenerContainer} (s). * / Collection publique <MessageListenerContainer> GetLisEnerContainers () {return Collections.unModifiBebleCollection (this.ListenerContainers.values ());} @OverRidepublic void start () {for (MessageListencerContainer StuenerContainer); }} / ** * Démarrez le {@Link MessageListenerContainer {@link MessageLenterConainer} s'il doit être démarré * au démarrage ou quand le démarrage est appelé explicitement après le démarrage. * @See MessageListenerContainer # IsautostArtup () * / private void startiFnessary (MessageListenContainer écouterContainer) {if (this.contextrefreshed || evenerContainer.isautostartup ()) {evenerContainer.Start (); }} @ OverRidePublic void stop () {for (MessageListERContainer écouterContainer: getListenerContainers ()) {evercerContainer.stop (); }} Écrivez un contrôleur, injectez RabbitListeneRendPoitregistry et activez et désactivez l'opération d'écoute à l'aide de start () et stop (). L'instance RabbitListeterendPoitregistry peut également obtenir le conteneur d'écoute et modifier certains paramètres de l'écoute, tels que le nombre de consommateurs. Le code est le suivant:
import java.util.set; import javax.annotation.resource; import org.springframework.amqp.rabbit.Listener.rabbitListenerendPointregistry; import org.springframework.amqp.rabbit.Listener.SimplemessageListencontainer; Importation; org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restController; import com.itopener.framework.resultmap; / ** * créé par fuwei.deg le 24 juillet 2017. RabbitMQController {@Resource privé RabbitListeneRendPoitregistry RabbitListedeRendPoinTregistry; @RequestMapping ("stop") public resultMap stop () {labbitListeneRendPoinTregistry.stop (); return resultMap.buildSuccess (); } @RequestMapping ("start") public resultMap start () {RabbitListedeRendPointregistry.Start (); return resultMap.buildSuccess (); } @RequestMapping ("Configuration") Public ResultMap Configuration (int Consumer, int maxconsumer) {set <string> conteneridrids = labbitListedeRendPoinTregistry.getListEnerContaineridS (); Conteneur simplessageListenderConainer = null; pour (String id: contenerides) {contener = (SimpleMessageListEnerContainer) RabbitListedeRendPoinTregistry.getListeContainer (ID); if (Container! = null) {contener.setConcurrentConsumers (consommateur); contener.setMaxConCurrentConsumers (MaxConsumer); }} return resultMap.BuildSuccess (); }}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.