เมื่อใช้ Spring Boot + RabbitMQ คุณอาจต้องการปิดการใช้งาน/เปิดใช้งานการฟังชั่วคราวหรือแก้ไขจำนวนผู้บริโภคในระหว่างการพัฒนา หากคุณรีสตาร์ทในแต่ละครั้งมันเป็นการเสียเวลาดังนั้นฉันได้ศึกษาเพื่อเปิดใช้งานการปิดการฟังหรือแก้ไขการกำหนดค่าบางอย่างโดยไม่ต้องปิดตัวลง
1. เกี่ยวกับการกำหนดค่าการฟัง RabbitMQ
@configuration@conditionalOnClass ({rabbittemplate.class, channel.class})@enableConfigurationProperties (rabbitProperties.class) @import (RabbitannotationDrivenconFiguration.class) คลาสสาธารณะ rabbitautoconfiguration RabbitannotationDrivenconfiguration ส่วนใหญ่มุ่งเน้นไปที่การตรวจสอบการกำหนดค่าของโรงงานและตรวจสอบโรงงาน แต่ที่นี่เพิ่งสร้างถั่วและไม่มีการเริ่มต้นจริง
ผ่านชื่อคลาสถั่วในการกำหนดค่าวิเคราะห์ การฟังของ RabbitMQ จะต้องถูกสร้างขึ้นโดยโรงงานฟังดังนั้นค้นหาโรงงานฟัง SimplerabbitListenerContainerFactory
@bean@conditionalonmissingbean (name = "rabbitlistenercontainerfactory") Public SimplerabbitListenerContainerFactory RabbitListenerContainerFactory (SimplerAbbitListenerContainerFactoryConfigurer SimplerAbbitListenerContainerFactory (); configurer.configure (โรงงาน, ConnectionFactory); กลับมาจากโรงงาน;}
เนื่องจากไม่มีการเริ่มต้นการเริ่มต้นในการกำหนดค่าอัตโนมัติจึงควรเรียกในที่อื่น เมื่อเข้าสู่ชั้นเรียนการฟังฉันพบว่ามีวิธีการเริ่มต้น (อินสแตนซ์ SimpleMessAgelistenerContainer) ฉันเดาว่าการเริ่มต้นจะต้องเกี่ยวข้องกับวิธีนี้ดังนั้นฉันจึงตรวจสอบสถานที่ที่เรียกว่าดังนั้นฉันจึงพบว่า rabbitlistenerendpointregistry.createlistenercontainer (RabbitListListenerendpoint จุดสิ้นสุด RabbitListenerContainerFactory <?> โรงงาน)
/*** สร้างและเริ่มต้น {@link messagelistenercontainer} ใหม่โดยใช้โรงงานที่ระบุ * @param endpoint จุดสิ้นสุดเพื่อสร้าง {@link messagelistenercontainer} * @param Factory the {@link RabbitListenerContainerFactory} ที่จะใช้ * @return the {@link MessageListenerContainer} */ป้องกัน MessageListenerContainer CreateListenerContainer (RabbitListenerendpoint จุดสิ้นสุด, RabbitListenerContainerFactory <?> โรงงาน) {MessageListenerContainer Listenererer = Factory.Createlistenercontainer (จุดสิ้นสุด); if (ListenerContainer อินสแตนซ์ของการเริ่มต้นเบียน) {ลอง {((initializingBean) ListenerContainer) .AfterProperTiesset (); } catch (exception ex) {โยน beaninitializationException ใหม่ ("ล้มเหลวในการเริ่มต้นคอนเทนเนอร์ผู้ฟังข้อความ", ex); }} int containerPhase = ListenerContainer.getPhase (); if (containerPhase <integer.max_value) {// ค่าเฟสที่กำหนดเองถ้า (this.phase <integer.max_value && this.phase! = containerphase) {โยน unlegalstateException ใหม่ ("เฟสที่ไม่ตรงกันระหว่างคำจำกัดความของโรงงานคอนเทนเนอร์ } this.phase = ListenerContainer.getphase (); } return ListenerContainer;}ดำเนินการต่อเพื่อค้นหาสถานที่ที่เรียกวิธีนี้ หลังจากค้นหาวิธี RabbitListenerendPoIntregistrar.AfterPropertiesset () ฉันพบว่ามีหลายสถานที่ที่จะเรียกมัน
ลองมาดูวิธี Afterpropertiesset ซึ่งอยู่ในอินเทอร์เฟซ InitializingBean เป็นที่คาดเดาได้ว่าควรเป็นวิธีการเริ่มต้นถั่วที่จะถูกเรียกหลังจากคอนเทนเนอร์ฤดูใบไม้ผลิสร้างถั่วดังนั้นค้นหาตำแหน่งที่ RabbitListenerendPoIntregistrar ถูกสร้างขึ้น ปรากฎว่ามันเป็นทรัพย์สินส่วนตัวใน RabbitListenerannotationBeanPostprocessor และ RabbitListenerannotationBeanPostProcessor เริ่มต้นในการกำหนดค่าอัตโนมัติของ RabbitbootstrapConfiguration
2. การจัดการแบบไดนามิกของการตรวจสอบ RabbitMQ
กลับไปที่คำถามเริ่มต้นฉันต้องการเปิดใช้งานการฟัง Disable MQ แบบไดนามิกดังนั้นฉันจึงดูคลาสการกำหนดค่าเริ่มต้นก่อน เนื่องจากมีการเริ่มต้นจึงอาจมีการจัดการที่เกี่ยวข้อง ดังนั้นฉันจึงพบวิธีการเริ่มต้น () และหยุด () ใน RabbitListenerEndPoInTregistry ซึ่งทำงานบนคอนเทนเนอร์การฟัง ซอร์สโค้ดหลักมีดังนี้
/*** @return อินสแตนซ์ {@link messagelistenercontainer} */คอลเล็กชันสาธารณะ <MessageListenerContainer> getListenercontainers () {return collections.unmodifiablecollection (this.listenercontainers.values ());} @Overridepublic start () {สำหรับ (MessageListenercontaNerercontainerer }}/** * เริ่มต้น {@link messageListenerContainer} ที่ระบุหากควรเริ่มต้น * เมื่อเริ่มต้นหรือเมื่อเริ่มต้นเรียกอย่างชัดเจนหลังจากเริ่มต้น * @See MessageListenerContainer#isautostartup () */โมฆะส่วนตัว startifnayary (MessageListenerContainer ListenererContainer) {ถ้า (this.contextrefreshed || ListenerContainer.isautostartup ()) }}@overridepublic เป็นโมฆะหยุด () {สำหรับ (messageListenerContainer ListenererContainer: getListenerContainers ()) {ListenerContainer.stop (); - เขียนคอนโทรลเลอร์ฉีด rabbitListenerendPoInTregistry และเปิดใช้งานและปิดใช้งานการฟังการฟังโดยใช้ Start () และหยุด () อินสแตนซ์ RabbitListenerEndPoInTregistry ยังสามารถรับคอนเทนเนอร์การฟังและแก้ไขพารามิเตอร์บางอย่างของการฟังเช่นจำนวนผู้บริโภค รหัสมีดังนี้:
นำเข้า java.util.set; นำเข้า javax.annotation.resource; นำเข้า org.springframework.amqp.rabbit.listener.rabbitlistenerendpointregistry นำเข้า org.springframework.amqp.rabbit.listener. org.springframework.web.bind.annotation.requestmapping; นำเข้า org.springframework.web.bind.annotation.restcontroller; นำเข้า com.itopener.framework.resultmap;/*** สร้างโดย Fuwei.deng ในวันที่ 24 กรกฎาคม 2017 */@restcontroller@requestmapping ("rabbitmq/listener") คลาสสาธารณะ RabbitMqController {@Resource ส่วนตัว RabbitListenerendPoInTregistry RabbitListenerEndPoInTregistry; @RequestMapping ("หยุด") ผลลัพธ์สาธารณะ stop () {rabbitListenerendPoInTregistry.stop (); return resultmap.buildsuccess (); } @RequestMapping ("เริ่มต้น") ผลลัพธ์สาธารณะเริ่มต้น () {rabbitListenerEndPoInTregistry.start (); return resultmap.buildsuccess (); } @RequestMapping ("การตั้งค่า") การตั้งค่า Public ResultsMap (Int Consumer, int maxConsumer) {ตั้งค่า <string> containerIds = RabbitListenerEndPoInTregistry.getListenerContainerIds (); SimpleMessAgelistenerContainer Container = NULL; สำหรับ (String ID: containerIds) {container = (simpleMessageListenerContainer) RabbitListenerEndPoInTregistry.getListenerContainer (ID); if (container! = null) {container.setCurrentConsumers (ผู้บริโภค); container.setMaxConcurrentConsumers (maxConsumer); }} return resultmap.buildsuccess (); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น