عند استخدام Spring Boot + RabbitMQ ، قد ترغب في تعطيل/تمكين الاستماع مؤقتًا ، أو تعديل عدد مستهلكي الاستماع أثناء التطوير. إذا قمت بإعادة التشغيل في كل مرة ، فهذا مضيعة للوقت ، لذلك قمت بدراسة لتمكين إلغاء تنشيط الاستماع أو تعديل بعض التكوينات دون الإغلاق.
1. حول تكوين الاستماع إلى RabbitMQ
@configuration@intenaLonClass ({RabbitTemplate.Class ، channel.class})@enableConfigurationProperties (rabbitproperties.class) import (RabbitannotationDrivenconFiguration.Class) الفئة العامة rabbitautoconfiguration {...} يركز RabbitannotationDrivenconfiguration بشكل أساسي على مراقبة تكوين المصنع ومراقبة المصنع ، ولكن هنا فقط إنشاء الفاصوليا ، وليس هناك تهيئة حقيقية.
من خلال اسم فئة الفول في التكوين ، قم بتحليله. يجب إنشاء الاستماع إلى RabbitMQ من قبل مصنع الاستماع ، لذلك ابحث عن مصنع الاستماع SimplerBbitListenerContainerFactory
@bean@intendalonmissingbean (name = "RabbitListenerContainerFactory") publicerabbitlistenerContainerFactory rabbitlistenerContainerFactory (simplerAbbitListenerContainerFactoryConfactoryConfIgurer connectionFactoryFactory) configurer.configure (المصنع ، connectionFactory) ؛ عودة المصنع ؛}
نظرًا لعدم وجود استماع تهيئة في التكوين التلقائي ، يجب استدعاؤه في أماكن أخرى. عند إدخال فئة مصنع الاستماع ، وجدت أن هناك طريقة initializeContainer (مثيل simplemessagelistenercontainer). أعتقد أن التهيئة يجب أن تكون مرتبطة بهذه الطريقة ، لذلك أتحقق من الأماكن التي يتم استدعاؤها ، لذلك وجدت أن RabbitListenerEndPoInTregistry.CreateListenerContainer (نقطة نهاية RabbitListenerendpoint ، وأسلوب RabbitListenerContainerFactory <؟> المصنع) لديه رمز لإنشاء حاوية الاستماع والتهيئة.
/*** إنشاء وبدء تشغيل {link messagelistenercontainer} جديد باستخدام المصنع المحدد. * param endpoint نقطة النهاية لإنشاء {link messagelistenercontainer}. * param Factory the {link rabbitlistenercontainerfactory} لاستخدامها. * return the {link messagelistenercontainer}. */MessagelistenerContainer CreateListenerContainer (RabbitListenerendpoint Endpoint ، RabbitListenerContainerFactory <؟> Factory) {messagelistenercontainer stisterainer = factory.createlistenercontainer (نقطة النهاية) ؛ if (stisterercontainer extremistizingbean) {try {((initializingBean) stareerContainer) .AfterPropertiesset () ؛ } catch (استثناء ex) {رمي جديد beaninitializationException ("فشل في تهيئة حاوية مستمع الرسائل" ، ex) ؛ }} int containerphase = staneerContainer.getPhase () ؛ if (containerphase <integer.max_value) {// قيمة الطور المخصصة إذا (this.phase <integer.max_value && this.phase! = containerphase) {رمي جديد غير aluvalstateException ("غير متطابق للمرحلة بين تعريفات مصنع الحاوية:" + هذا. } this.phase = listenerContainer.getPhase () ؛ } إرجاع stisterercontainer ؛}استمر في العثور على المكان لاستدعاء هذه الطريقة. بعد العثور على طريقة RabbitListenerEndPoinTregistrar.afterPropertiesset () ، وجدت أن هناك العديد من الأماكن التي تسميها.
دعونا نلقي نظرة على طريقة ما بعد propertiesset ، والتي هي في واجهة التهيئة. من المفكر أنه يجب أن تكون طريقة تهيئة الفول التي سيتم استدعاؤها بعد أن تنشئ حاوية الربيع الفول ، لذلك ابحث عن مكان إنشاء RabbitListenerEndPoinTregistrar. اتضح أنها ملكية خاصة في RabbitListenerannotationBeanPostProcessor ، ويتم تهيئة RabbitListenerannotationBeanPostProcessor في التكوين التلقائي لتكوين RabbitbootstrapCon
2. الإدارة الديناميكية لمراقبة RabbitMQ
بالعودة إلى السؤال الأولي ، أريد تمكينًا ديناميكيًا للاستماع إلى تعطيل MQ ، لذلك أنظر أولاً إلى فئة التكوين الأولية. نظرًا لوجود تهيئة ، قد تكون هناك إدارة ذات صلة. لذلك وجدت أساليب Start () و Stop () في RabbitListenerendPoinTregistry ، التي تعمل على حاوية الاستماع. رمز المصدر الرئيسي هو كما يلي
/*** return المدار {link messagelistenercontainer} مثيل (s). */مجموعة عامة <SessagelistenerContainer> getListenerContainers () {return collections.unmodifiableCollection (this.listenerContainers.values ()) ؛} @Overridepublic void start () {for (messagelistenercontainer styeRcontainer: getListenerContainers () }}/** * ابدأ تشغيل {link messagelistenercontainer} إذا كان يجب أن يبدأ * عند بدء التشغيل أو عندما يتم استدعاء البدء بشكل صريح بعد بدء التشغيل. * see @messagelistenercontainer#isautostartup () */private void startNecessary (messagelistenercontainer listererContainer) {if (this.contextrefreshed || stistererContainer.isautostArtup ()) }}@OutdRidepublic void stop () {for (messagelistenerContainer stistererContainer: getListEnerContainers ()) {stiNeRerContainer.stop () ؛ }} اكتب وحدة تحكم ، وحقن rabbitlistenerendpointregistry ، وتمكين وتعطيل عملية الاستماع باستخدام Start () و STOP (). يمكن لمثيل RabbitListenerEndPoinTregistry أيضًا الحصول على حاوية الاستماع وتعديل بعض المعلمات للاستماع ، مثل عدد المستهلكين. الرمز كما يلي:
استيراد java.util.set ؛ استيراد javax.annotation.resource ؛ استيراد org.springframework.amqp.ribbit.listener.RabbitListenerendPoinTregistry org.springframework.web.bind.annotation.requestmapping ؛ استيراد org.springframework.web.bind.annotation.restController rabbitmqController {resource private rabbitlistenerendpointregistry rabbitlisterenderendpointregistry ؛ requestmapping ("stop") resultmap stop () {RabbitListenerendPoinTregistry.stop () ؛ return resultmap.buildsuccess () ؛ } @requestmapping ("start") public resultmap start () {RabbitListenerendPoinTregistry.start () ؛ return resultmap.buildsuccess () ؛ } @requestmapping ("setup") إعداد النتيجة العامة (int consumer ، int maxconsumer) {set <string> containerids = rabbitlistenerendpointregistry.getListenerContainerids () ؛ SimplemessageListenerContainer Container = null ؛ لـ (معرف السلسلة: ContainerIDs) {Container = (SimpleMessageListenerContainer) rabbitlistenerendpointregistry.getListenerContainer (id) ؛ if (Container! = null) {Container.setConcurrentConsumers (المستهلك) ؛ Container.setMaxConcurrentConsumers (MaxConsumer) ؛ }} return resultmap.buildsuccess () ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.