Cuando use Spring Boot + RabbitMQ, es posible que desee deshabilitar/habilitar temporalmente la escucha o modificar el número de consumidores que escuchan durante el desarrollo. Si se reinicia cada vez, es una pérdida de tiempo, por lo que he estudiado para habilitar la audición de desactivado o modificar algunas configuraciones sin apagar.
1. Acerca de la configuración de la escucha de RabbitMQ
@Configuration@ConditionAlonClass ({rabbittemplate.class, channel.class})@habiledeconfigurationProperties (rabbitproperties.class) @import (rabbitannotationdrivenconfiguration.class) clase pública rabbitAutoconfiguration {...} RabbitannotationDrivenconfiguration se centra principalmente en monitorear la configuración de la fábrica y monitorear la fábrica, pero aquí solo está creando frijoles, y no hay una inicialización real.
A través del nombre de la clase Bean en la configuración, analíelo. La escucha de Rabbitmq debe ser creada por la fábrica de escucha, así que busque la fábrica de escucha SimpleBbitListenContainerFactory
@Bean@ConditionalOnMissingBean(name = "rabbitListenerContainerFactory")public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory( SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configer.configure (fábrica, conexiónFactory); return fábrica;} Dado que no hay una escucha inicializada en la configuración automática, debe llamarse en otros lugares. Al ingresar a la clase de fábrica de escucha, descubrí que existe el método InitializeContainer (SimpleMessageListenContainer). Supongo que la inicialización debe estar relacionada con este método, por lo que verifico qué lugares se llaman, por lo que descubrí que el Método RabbitListenerendPoInTregistry.CreateListenerContainer (RabbitListenerSnpoint EndPoint, RabbitListenerContainerFactory <?> Factory) tiene el código para crear el contenedor de escucha y la inicialización.
/*** Crear e iniciar un nuevo {@link MessageListenerContainer} usando la fábrica especificada. * @param Endpoint el punto final para crear un {@link MessageListenerContainer}. * @param fábrica el {@link rabbitListenerContainerFactory} para usar. * @return el {@link MessageListenerContainer}. */Profected MessageListenerContainer CreateListenContainer (RabbitListenerSnepoint Endpoint, RabbitListenerContainerFactory <?> Factory) {MessageListenerContainer ListenContainer = factory.CreateListEnperContainer (punto final); if (escuchaContainer institure of InitializingBean) {try {((InitializingBean) ListenContainer) .AfterPropertIesset (); } Catch (Exception Ex) {Throw New BeanInitializationException ("No se pudo inicializar el contenedor del oyente del mensaje", ex); }} int ContenedorPhase = LearchEctainer.getPhase (); if (ContainerPhase <Integer.max_value) {// Un valor de fase personalizado if (this.phase <integer.max_value && this.phase! = ContainerPhase) {tirar nueva ilegalstateException ("Mismgo de fase encontrado entre las definiciones de fábrica de fábrica:" + this.phase + "vs" + contenedorphase); } this.phase = Learchertainer.getPhase (); } return ListenContainer;}Continúe encontrando el lugar para llamar a este método. Después de encontrar el método RabbitListenERENDPOINTREGISTRAR.AFTERPROPERTIESSET (), descubrí que hay muchos lugares para llamarlo.
Echemos un vistazo al método AfterPropertIesset, que se encuentra en la interfaz inicializadora. Se adivina que debería ser el método de inicialización de frijoles el que se llamará después de que el contenedor de resorte crea el frijol, así que encuentre dónde se creó el conejo de rabbitListenerendPoIrgistrar. Resulta que es una propiedad privada en el rabbitListenerannotationBeanPostProcessor, y el conejo rabbitListenerAnnotationBeanPostprocessor se inicializa en la configuración automática de la concentración de rabbitbootstraPTRAPTRAPURA
2. Gestión dinámica de monitoreo de RabbitMQ
Volviendo a la pregunta inicial, quiero habilitar dinámicamente la escucha de MQ, por lo que primero veo la clase de configuración inicial. Dado que existe una inicialización, puede haber una gestión relevante. Así que encontré los métodos Start () y Stop () en el RabbitListenerSdPoIrgistry, que opera en el contenedor de escucha. El código fuente principal es el siguiente
/*** @return la instancia (s) administrada {@link MessageListenerContainer}. */colección pública <sessageListenerContainer> getListenerContainers () {return Collections.unmodifiaBlecollection (this.listenerContainers.values ());} @OverridePublic Void Start () {for (MessageListenerContainer ListenerContainer: GetListenContainers ()) {Startifnecessary (Startifnecessary (Startifnecessary (Startifnecessary (StartifnECSEART (StartifnECSEAR }}/** * Inicie el especificado {@link MessageListenerContainer} Si debe iniciarse * en el inicio o cuando el inicio se llama explícitamente después del inicio. * @see MessageListenerContainer#isaTosToRartUp () */private void startifnecessary (MessageListenerContainer ListenContainer) {if (this.contextrefreshed || ListenContainer.ISaUtastArtUp ()) {ListenContainer.start (); }}@OverridePublic void stop () {for (MessageListenerContainer ListenContainer: GetListenerContainers ()) {ListenContainer.stop (); }} Escriba un controlador, inyecte RabbitListenerSnEndPoIrgistry, y habilite y deshabilite la operación de escucha usando Start () y Stop (). La instancia de RabbitListenERENDPOINTREGISTRISTRIMISTRIMIS también puede obtener el contenedor de escucha y modificar algunos parámetros de la escucha, como el número de consumidores. El código es el siguiente:
import java.util.set; import javax.annotation.resource; import org.springframework.amqp.rabbit.listener.rabbitListenerendPoInTregistry; import o org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; import com.itoPener.framework.resultmap;/** * creado por fuwei.Deng el 24 de julio de 2017. */@restslerer@requestmapping ("RABBITMQ/) RabbitMQController {@Resource RabbitListenerSnerendPoIrgistry RabbitListenerendPoIrgistry; @RequestMapping ("Stop") public dultMap stop () {rabBitListenerSnEdPoInTregistry.stop (); return resultMap.BuildSuccess (); } @RequestMapping ("inicio") public dultMap start () {rabBitListenerSnEndPoIrgistry.Start (); return resultMap.BuildSuccess (); } @RequestMapping ("Setup") Public ResultMap Setup (int Consumer, int maxConsumer) {set <string> contenedorIds = rabBitListenerEndPoIntregistry.getListenerContainerIds (); SimpleMessageListenerContainer Container = null; for (String ID: ContainerIds) {Container = (SimpleMessageListenerContainer) RabBitListenerSnenerSnTreGistry.getListenerContainer (id); if (Container! = Null) {Container.setConcurrentConsumers (consumidor); Container.SetMaxConcurrentConsumers (maxConsumer); }} return resultMap.BuildSuccess (); }}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.