Spring Boot + RabbitMQ를 사용할 때는 청취 중 일시적으로 비활성화/활성화 또는 개발 중 청취 소비자 수를 수정할 수 있습니다. 매번 다시 시작하면 시간 낭비이므로, 종료하지 않고 일부 구성을 비활성화하거나 일부 구성을 수정하는 것을 연구했습니다.
1. RabbitMQ 청취의 구성에 대해
@configuration@conditionalOnclass ({rabbittemplate.class, channel.class})@enableconfigurationProperties (rabbitProperties.class) @import (rabbitannotationdrivenconfiguration.class) public class rabbitautoconfiguration {...} RabbitannotationDrivenConfiguration은 주로 공장의 구성 모니터링 및 공장을 모니터링하는 데 중점을 두지 만 여기에는 콩을 만드는 것이 있으며 실제 초기화는 없습니다.
구성의 Bean 클래스 이름을 통해 분석하십시오. Rabbitmq의 청취는 듣기 공장에서 만들어야하므로 듣기 공장을 단순화하는 공장을 찾으십시오.
@bean@컨디셔닝 족 (namesalonmissingbean) (name = "name ="rabbitlistenercontainerfactory ")) public simplerabbitlistenercontainerfactory labbitlistenercontainerfactory (simplerabbitlistenercontainerfactoryconfiger, connectionfactory connection actory) {simplerabbitlistenerconerfactory factory = new SimplerAbbitListEnerContainErFactory (); configurer.configure (Factory, ConnectionFactory); 반품 공장;} 자동 구성에는 초기 청취가 없으므로 다른 장소에서 호출해야합니다. Listening Factory 클래스에 들어가면 초기 초기 컨테이너 (SimplemessAgelistenerContainer 인스턴스) 메소드가 있음을 알았습니다. 초기화는이 방법과 관련되어야한다고 생각합니다. 따라서 어느 장소가 호출되는지 확인하므로 RabbitListenerendPoinTregistry.createListenerContainer (RabbitListEnerendpoint Endpoint, RabbitListenerContainerFactory <?> factory) 방법은 청취 컨테이너 및 초기화를 만들기위한 코드를 가지고 있음을 알았습니다.
/*** 지정된 공장을 사용하여 새로운 {@link messagelistenercontainer}를 생성하고 시작합니다. * @param 엔드 포인트 {@link messagelistenercontainer}를 생성하기 위해 엔드 포인트. * @param factory {@link rabbitlistenercontainerfactory}를 사용할 수 있습니다. * @Return {@link MessagelistenerContainer}. */보호 된 MessageListenerContainer CreateListenerContainer (RabbitListenerendpoint endpoint, RabbitListenerContainerFactory <?> Factory) {MessagelistenerContainer ListenErcontainer = factory.createlistenercontainer (endpoint); if (초기화 비의 ListenErcontainer 인스턴스) {try {((초기화) ListenErcontainer) .afterProperTiesset (); } catch (예외) {Throw New BeanInitializationException ( "메시지 청취자 컨테이너를 초기화하지 못했습니다", 예); }} int containerPhase = ListenErContainer.getPhase (); if (containerPhase <integer.max_value) {// if (this.phase <integer.max_value && this.phase! = containerPhase) {컨테이너 공장 정의 사이의 새로운 불법 스테이트 exception ( " + this. } this.chease = listenerContainer.getPhase (); } return listenerContainer;}이 방법을 호출 할 장소를 계속 찾으십시오. RabbitListenerendeRendpointregistrar.fterProperTiesset () 메소드를 찾은 후에는 전화 할 곳이 많이 있음을 알았습니다.
초기화에 비해 인터페이스에있는 AfterProperTiesset 메소드를 살펴 보겠습니다. 스프링 컨테이너가 콩을 생성 한 후에 호출 될 콩 초기화 방법이어야한다고 추측합니다. RabbitlistenerannotationBeanPostProcessor의 사유지이며 RabbitListenerAnnotationBeanPostsorsor는 RabbitbootStrapconfiguration의 자동 구성에서 초기화되어 토끼 MQ의 초기 청취의 원인을 발견합니다.
2. RabbitMQ 모니터링의 동적 관리
초기 질문으로 돌아가서 MQ 비활성화의 청취를 동적으로 활성화하려면 먼저 초기 구성 클래스를 살펴 봅니다. 초기화가 있으므로 관련 관리가있을 수 있습니다. 그래서 나는 청취 컨테이너에서 작동하는 RabbitlistenerendpoinTregistry에서 start () 및 stop () 메소드를 찾았습니다. 기본 소스 코드는 다음과 같습니다
/*** @return {@link messagelistenercontainer} instance (s). */public collection <messagelistenercontainer> getListenerContainers () {return collections.unmodifiableCollection (this.listenerContainers.values ());} @overridepublic void start () {for (messAgelistenercontainer : getListenerContainers ()); }}/** * 지정된 {@link messagelistenercontainer}를 시작 해야하는 경우 * 시작시 또는 시작 후 시작이 명시 적으로 호출되는 경우 시작하십시오. * @see messagelistenercontainer#isautostartup () */private void startifnecessary (messagelistenercontainer listenercontainer) {if (this.contextrefreshed || listenercontainer.isautostartup ()) {listenercontainer.start (); }}@atrementpublic void stop () {for (messagelistenercontainer listenercontainer : getListenerContainers ()) {ListenContainer.stop (); }} 컨트롤러를 작성하고 RabbitListenerendPoinTregistry를 주입하고 start () 및 stop ()를 사용하여 청취 작업을 활성화하고 비활성화하십시오. RabbitlistenerendeRendpoinTregistry 인스턴스는 청취 컨테이너를 얻고 소비자 수와 같은 청취의 일부 매개 변수를 수정할 수 있습니다. 코드는 다음과 같습니다.
import java.util.set; import javax.annotation.resource; import org.springframework.amqp.rabbit.listener.rabbitlistenerendpointregistry; import org.springframework.amqp.rabbit.listener.simpleessagelistenercontainer; 수입 org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; import com.itopener.framework.resultmap;/** * 2017 년 7 월 24 일에 fuwei.deng에 의해 생성 된 ** */@restcontroller@rackmq/restenter ( ") RabbitmqController {@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 컨테이너 = null; for (string id : containerids) {container = (simplemessagelistenercontainer) rabbitlistenerendpointregistry.getListenerContainer (id); if (container! = null) {container.setConcurrentConsumers (소비자); Container.SetMaxConcurrentConsumers (MaxConsumer); }} return resultMap.BuildSuccess (); }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.