Spring Boot + RabbitMQを使用する場合、開発中にリスニングを一時的に無効/有効にするか、リスニング消費者の数を変更することをお勧めします。毎回再起動すると、時間の無駄があるので、閉鎖せずにリスニングを無効にしたり、構成を変更したりするように勉強しました。
1。RabbitMQリスニングの構成について
@configuration@conditionalonclass({rabbittemplate.class、channel.class})@enableconfigurationproperties(rabbitproperties.class)@import(rabbitannotationdrivenconfiguration.class)パブリッククラスrabbitautoconfiguration {...}} Rabbitannotationdrivenconfigurationは、主に工場の構成の監視と工場の監視に焦点を当てていますが、ここでは豆を作成するだけで、実際の初期化はありません。
構成内のBeanクラス名を使用して、分析します。 rabbitmqのリスニングはリスニングファクトリーによって作成されなければならないので、リスニングファクトリーを見つけてくださいsimplerabbitlistenercontainerfactory
@bean@cosditionalonmissingbean(name = "rabbitlistenercontainerfactory")public simplerabbitlistenercontainerfactory rabbitlistenercontainerfactory(simplerabbitlistenercontainerfactory(simpleerabbitlistenerfactoryconfigurer configurer、connectionfactoryfactoryfactory){simplerabbitonercontainerfactory factory factory simplerabbitlistenercontainerfactory(); Configurer.Configure(Factory、ConnectionFactory);ファクトリーを返します;}自動構成に初期化されたリスニングはないため、他の場所で呼び出される必要があります。リスニングファクトリークラスに入ると、initializecontainer(simplemessageListenercontainerインスタンス)メソッドがあることがわかりました。初期化はこの方法に関連している必要があると思うので、どの場所が呼び出されるかを確認するので、rabbitlistenerendpointregistry.createListenerEndPointのエンドポイント、rabbitlistenercontainererfactory <?> factory)メソッドがリスニングコンテナと初期化を作成するためにコードを作成します。
/***指定された工場を使用して、新しい{@link messageListenercontainer}を作成して起動します。 * @paramエンドポイントエンドポイントを作成して{@link messageListenercontainer}を作成します。 * @param Factory使用する{@link rabbitlistenercontainerfactory}。 * @return {@link messageListenercontainer}。 */Protected MessageListenerContainer CreateListenerContainer(RabbitListenerEndPoint Endpoint、RabbitListenerContainerFactory <?> Factory){MessageListenerContainer sienderContainer = Factory.CreateListenerContainer(EndPoint); if(riendercontainer intivalizingbeanのインスタンス){try {((initializingbean)riendercontainer).afterpropertiesset(); } catch(Exception ex){新しいbeanInitializationexception( "メッセージリスナーコンテナの初期化に失敗しました"、ex); }} int containerphase = ristenecontainer.getphase(); if(containerphase <integer.max_value){//カスタム位相値if(this.phase.max_value && this.phase!= containerphase!= containerphase){"container Factory Definitions:" + this.phase + "vs" + contaterphase); } this.phase = ristenecontainer.getphase(); } returinecontainer;}この方法を呼び出す場所を見つけ続けてください。 rabbitlistenerendpointregistrar.afterpropertiesset()メソッドを見つけた後、私はそれを呼ぶべき多くの場所があることを発見しました。
intializingbeanインターフェイスにあるAfterpropertiessetメソッドを見てみましょう。スプリングコンテナがBeanを作成した後に呼び出されるのはBean初期化方法であるべきであると推測されるので、Rabbitlistenerendpointregistrarが作成された場所を見つけてください。 rabbitlistenerannotationbeanpostprocessorの私有財産であり、rabbitlistenerannotationbeanpostprocessorはrabbitbootstrapconfigurationの自動構成で初期化されているため、Rabbitmqの初期化されたリスニングのソースを見つけます。
2。RabbitMQモニタリングの動的管理
最初の質問に戻ると、MQを無効にするリスニングを動的に有効にしたいので、最初に最初の構成クラスを見ていきます。初期化があるため、関連する管理が存在する場合があります。そこで、リスニングコンテナで動作するrabbitlistenerendpointregistryでstart()and Stop()メソッドを見つけました。メインソースコードは次のとおりです
/*** @returnマネージド{@link messageListenercontainer}インスタンス。 */public collection <messageListenercontainer> getListenerContainers(){return collections.unmodifiablecollection(this.listenercontainers.values());} @overridepublic void start(){for(messageListenercontainer ristenserer:sistenercontainer(getlistenercontain){) }}/** *指定された{@link messageListenercontainer}は、起動時に起動する必要がある場合、または起動後に明示的に呼び出された場合に起動します。 * @see messageListenercontainer#isautostartup() */private void startifn decessary(messageListenercontainer reshinercontainer){if(this.contextrefreshed || shulidecontainer.isautostartup(){ristencontainer.start(); }}@overridepublic void stop(){for(messageListenercontainer reshinercontainer:getListenerContainers()){riendercontainer.stop(); }}コントローラーを作成し、rabbitListenerendPointregistryを注入し、start()とstop()を使用してリスニング操作を有効にして無効にします。 rabbitlistenerendpointregistryインスタンスは、リスニングコンテナを取得し、消費者の数などのリスニングのパラメーターを変更することもできます。コードは次のとおりです。
java.util.set; Import javax.annotation.resource; Import org.springframework.amqp.rabbit.listener.rabbitlistenerendpointregistry; Import org.springframework.amqp.rabbit.listener.simsagelistenercontainer; Import; org.springframework.web.bind.annotation.RequestMapping; Import org.springframework.web.bind.annotation.restController; Import com.itopener.framework.resultmap;/** * fuwei.dengが2017年7月にfuwei.dengによって作成されました。 rabbitmqController {@Resource Private RabbitListenErendPointregistry RabbitListenerendPointregistristreistry; @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.getListenercontainids(); SimpleMessageListenerContainer container = null; for(string id:containerids){container =(simplemessageListenercontainer)rabbitlistenerendpointregistry.getListenerContainer(id); if(container!= null){container.setConcurrentConsumers(Consumer); container.setMaxConCurrentConsumers(MaxConsumer); }} return resultmap.buildsuccess(); }}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。