Saat menggunakan Boot Spring + RabbitMQ, Anda mungkin ingin menonaktifkan/mengaktifkan untuk sementara mendengarkan, atau memodifikasi jumlah konsumen yang mendengarkan selama pengembangan. Jika Anda restart setiap kali, itu adalah buang -buang waktu, jadi saya telah belajar untuk mengaktifkan menonaktifkan mendengarkan atau memodifikasi beberapa konfigurasi tanpa dimatikan.
1. Tentang Konfigurasi RabbitMQ Mendengarkan
@Configuration@conditionAnclass ({rabbittemplate.class, channel.class})@enableConfigurationProperties (rabbitproperties.class) @import (rabbitaNotationDrivenconfiguration.class) RabbitautoconFiguration {...} RabbitaNotationDrivenconfiguration terutama berfokus pada pemantauan konfigurasi pabrik dan memantau pabrik, tetapi di sini hanya membuat kacang, dan tidak ada inisialisasi nyata.
Melalui nama kelas kacang dalam konfigurasi, analisislah. Mendengarkan Rabbitmq harus dibuat oleh pabrik mendengarkan, jadi temukan pabrik mendengarkan SimpleRabbitListenerContainerFactory
@Bean@conditionmissingbean (name = "RabbitListenerContainerFactory") PUBLIC SimplerAbBitListenerContainerFactory RabbitListenerContainerFactory (SimpleAbbitListenerererFactoryConfigurer ConfacoryCory, ConnectionFactory ConnectionFactory) {SimpleRabbit SimpleRabBitListenerContainerFactory (); configurer.configure (pabrik, ConnectionFactory); mengembalikan pabrik;} Karena tidak ada pendengaran yang diinisialisasi dalam konfigurasi otomatis, itu harus dipanggil di tempat lain. Memasuki kelas Pabrik Mendengarkan, saya menemukan bahwa ada metode initializeContainer (SimpleMessAgelistenerContainer). Saya kira inisialisasi harus terkait dengan metode ini, jadi saya memeriksa tempat mana yang dipanggil, jadi saya menemukan bahwa rabbitlistenerendpointregistry.createListenerContainer (metode akhir RabbitListenEndpoint, Metode RabbitListenerContainererFactory <?> Factory) memiliki kode untuk membuat wadah mendengarkan dan inisialisasi.
/*** Buat dan mulai {@link messagelistenerContainer} baru menggunakan pabrik yang ditentukan. * @param endpoint titik akhir untuk membuat {@link messagelistenercontainer}. * @param factory {@link rabbitListenerContainerFactory} untuk digunakan. * @return {@link messagelistenercontainer}. */Lindung MessageListenerContainer CreateListenerContainer (RabbitListenerendpointpoint titik akhir, RabbitListenerContainerFactory <?> Factory) {MessagelistenerContainer listenerContainer = factory.createlistenercontainer (endpoint); if (listenerContainer instance dari initializingBean) {coba {((initializingBean) listenerContainer) .AfterPropertiesset (); } catch (Exception ex) {Throw New BeanInitializationException ("Gagal menginisialisasi wadah pendengar pesan", ex); }} int containerphase = listenerContainer.getPhase (); if (containerphase <integer.max_value) {// nilai fase kustom if (this.phase <integer.max_value && this.phase! = containerphase) {lempar baru ilegalstateException ("ditemui fase kecemasan antara contonterer definisi pabrik:" + ini. } this.phase = listenerContainer.getPhase (); } return listenerContainer;}Terus temukan tempat untuk memanggil metode ini. Setelah menemukan metode RabbitListenerendpointregistrar.AfterPropertiesset (), saya menemukan bahwa ada banyak tempat untuk menyebutnya.
Mari kita lihat metode afterpropertiesset, yang ada di antarmuka inisialisasi. Dapat ditebak bahwa itu harus menjadi metode inisialisasi kacang yang akan dipanggil setelah wadah musim semi menciptakan kacang, jadi temukan di mana kelinci -asramaerendpointregistrar dibuat. Ternyata itu adalah properti pribadi di RabbitListenernotationBeanPostProcessor, dan RabbitListenernotationBeanPostProcessor diinisialisasi dalam konfigurasi otomatis rabbitbitboottrapconfiguration, jadi ini menemukan sumber pendengaran yang diinisialisasi dari RabbitMQ, RabbitMQ
2. Manajemen Dinamis Pemantauan RabbitMQ
Kembali ke pertanyaan awal, saya ingin secara dinamis mengaktifkan mendengarkan Disable MQ, jadi saya pertama kali melihat kelas konfigurasi awal. Karena ada inisialisasi, mungkin ada manajemen yang relevan. Jadi saya menemukan metode start () dan stop () di RabbitListenerenendpointregistry, yang beroperasi pada wadah mendengarkan. Kode sumber utama adalah sebagai berikut
/*** @return The Managed {@link MessagelistenerContainer} instance (s). */public Collection<MessageListenerContainer> getListenerContainers() { return Collections.unmodifiableCollection(this.listenerContainers.values());} @Overridepublic void start() { for (MessageListenerContainer listenerContainer : getListenerContainers()) { startIfNecessary(listenerContainer); }}/** * Mulai {@link MessageListenerContainer yang ditentukan} jika harus dimulai * pada startup atau ketika mulai disebut secara eksplisit setelah startup. * @Lihat MessagelistenerContainer#isAutostArtup () */private void startIfNecessary (MessageListenerContainer listenerContainer) {if (this.contextrefreshed || listenerContainer.isAutostArtup ()) {listenerContainer.start (); }}@Overridepublic void stop () {for (MessageListenerContainer listenerContainer: getListenContainers ()) {listenerContainer.stop (); }} Tulis pengontrol, suntikkan RabbitListenerendPointregistry, dan aktifkan dan nonaktifkan operasi mendengarkan menggunakan start () dan stop (). Contoh RabbitListenerendPointregistry juga dapat memperoleh wadah mendengarkan dan memodifikasi beberapa parameter mendengarkan, seperti jumlah konsumen. Kodenya adalah sebagai berikut:
Impor java.util.set; impor javax.annotation.resource; impor org.springframework.amqp.rabbit.listener.rabbitlistenerendpointregistry; impor org.springframework.amqp.rabbit.listener.simplemesagelistenenercererererererererererer.rabbit.listener.simplemessagelisten org.springframework.web.bind.annotation.requestmapping; impor org.springframework.web.bind.annotation.RestController; impor com.itopener.framework.resultMap;/** * Diciptakan oleh fuwei.deng pada 24 Juli 2017. RabbitMQController {@resource Private RabbitListenerendpointregistry RabbitListenerendPointregistry; @RequestMapping ("Stop") Public RacesMap Stop () {RabbitListenerendpointregistry.stop (); return resultMap.buildsuccess (); } @RequestMapping ("Start") Public RacesMap Start () {RabbitListenerEndPointregistry.Start (); return resultMap.buildsuccess (); } @RequestMapping ("setup") Pengaturan Hasil Publik (Int Consumer, Int MaxConsumer) {Set <String> containerIds = RabbitListenerEndPointregistry.getListenerContainerIds (); SimpleMessAgelistenerContainer Container = NULL; untuk (ID String: ContainerIds) {container = (SimpleMessAgeListenerContainer) RabbitListenerEndPointregistry.GetListenerContainer (id); if (container! = null) {container.setConcurrentConsumers (konsumen); container.setmaxConcurrentConsumers (maxconsumer); }} return resultMap.buildsuccess (); }}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.