Pada artikel sebelumnya, kami menerapkan konfigurasi fleksibel dari sistem pesan. Alih -alih menggunakan konfigurasi sakelar fanout. Gunakan sakelar langsung dan memiliki kemampuan untuk secara selektif menerima pesan setelah tombol routing.
Meskipun menggunakan sakelar koneksi langsung dapat meningkatkan sistem kami, ia masih memiliki keterbatasan dan tidak dapat mengimplementasikan beberapa kondisi kondisi.
Dalam sistem pesan kami, kami ingin berlangganan tidak hanya ke antrian berbasis kunci routing, tetapi juga ke sumber berbasis pesan produksi. Konsep -konsep ini berasal dari Syslog Alat UNIX. Log ini didasarkan pada metode perutean yang ketat (info/warn/crit ...) dan mudah (auth/cron/kern ...). Contoh kami lebih sederhana dari yang ini.
Contoh ini akan memberi kita banyak fleksibilitas, misalnya, kami ingin mendengarkan log kesalahan 'cron' dan semua log dari 'kern'.
Untuk mencapai fleksibilitas ini, kita perlu tahu lebih banyak tentang sakelar topik.
Sakelar tema
Saat menggunakan sakelar topik, Anda tidak dapat menggunakan kunci perutean sewenang -wenang. Format kunci perutean harus menjadi kata -kata yang dibagi dengan poin. Kata apa pun yang Anda gunakan biasanya dapat mengungkapkan artinya. Misalnya "stock.usd.nyse", "nyse.vmw", "quick.orane.rabbit". Tetapi ukuran kata terbatas hingga maksimum 255 byte.
Gunakan sakelar tema untuk menentukan tombol routing untuk memperhatikan 2 poin
Tentukan kunci perutean yang cocok dengan sakelar topik
Dalam contoh ini, kami akan mengirim semua pesan yang menggambarkan hewan tersebut. Pesan ini akan dikirim bersama dengan kunci perutean yang terdiri dari 3 kata dan 2 poin. Kata pertama adalah untuk mengekspresikan kecepatan, yang kedua menggambarkan warna, dan yang ketiga menjelaskan jenis: "<speed>. <nolor>. <pesesies>".
Buat tiga jenis binding, q1 dan kunci "*.atane.*" Binding, Q2 dan "*.*. Rabbit" dan "Lazy.#" Binding.
Gambaran umum dari tiga hubungan yang mengikat adalah:
Pesan dengan tombol routing diatur ke "Quick.ORANGE.RABBIT" akan diteruskan ke antrian Q1 dan Q2. Hal yang sama berlaku untuk "Lazy.orange.elephant" juga. "Quick.orange.fox" akan pergi ke antrian pertama, "Lazy.brown.fox" akan pergi ke antrian kedua, dan "Lazy.pink.rabbit" akan pergi ke antrian kedua tepat waktu. Itu cocok dengan 2 binding. "Quick.brown.fox" akan dibuang karena ketidakcocokan.
Jadi bagaimana dengan "oranye" dan "quick.orange.male.rabbit"? Karena tidak ada ikatan yang cocok, itu akan dibuang.
Jadi bagaimana dengan kunci perutean "lazy.orange.male.rabbit"? , karena malas.# cocok ini akan diteruskan ke antrian kedua.
Tips untuk penukar tema
Tema sakelar itu luar biasa dan bertindak mirip dengan sakelar lainnya.
Contoh Kode
Kode tidak berbeda dari kode perutean sebelumnya, silakan lihat
Config.java
Paket com.zb.rabbitmqtest.t5topics.config; impor org.springframework.amqp.core.*; impor org.springframework.context.annotation.bean; impor org.springframework.context.annotation.onfiguration;/** ** @springframework.context.annotation.onfigurasi;/** ** ** @a =* @a =* @ "T5Config") Config Class Public {/*** Dibuat oleh: Zhang Bo* Waktu: 2018/3/5 10:45 AM* @apinote Define Topic Exchange*/@Bean TopicexChange TopicexChange () {return TopicexChange baru ("Topic-Exexchange"); }/*** Pencipta: Zhang Bo* Waktu: 2018/3/5 10:48 AM* @apinote definisi untuk secara otomatis menghapus antrian anonim*/@bean antrian publik autodeletequeue0 () {return new anonymousqueue (); }/*** Pencipta: Zhang Bo* Waktu: 2018/3/5 10:48 AM* @apinote definisi untuk secara otomatis menghapus antrian anonim*/@bean antrian publik autodeletequeue1 () {return new anonymousqueue (); } /** * Created by: Zhang Bo* Time: 2018/3/5 10:48 am * @param topicExchange Theme Switch* @param autoDeleteQueue0 Automatically delete the queue* @apiNote Binding Use the routing key orange to queue to the topic switch* @return Binding */ @Bean public Binding binding0a(TopicExchange topicExchange, Queue autodeleteQueue0) {return bindingBuilder.bind (autodeletequeue0) .to (topicexchange) .with ("*oranye.*"); }/*** Dibuat oleh: Zhang Bo* Waktu: 2018/3/5 10:48 AM* @param TopicexChange Tema saklar* @param autodeleteueue1 secara otomatis menghapus antrian* @apinote bindingchxch1 @ @ @ @@beank1 dengan routing kunci black to the topic switch* @return binding*/ @ Antrian autodeletequeue1) {return bindingBuilder.bind (autodeletequeue1) .to (topicexchange) .with ("*.*. Kelinci"); } /** * Created by: Zhang Bo* Time: 2018/3/5 10:48 am * @param topicExchange Theme Switch* @param autoDeleteQueue1 Automatically delete the queue* @apiNote Binding Use the routing key green to queue to the topic switch* @return Binding */ @Bean public Binding binding1b(TopicExchange topicExchange, Queue autodeletequeUe1) {return bindingBuilder.bind (autodeletequeue1) .to (topicexchange) .with ("malas.#"); }} Receiver.java
Paket com.zb.rabbitmqtest.t5topics.receiver; impor org.springframework.amqp.rabbit.annotation.rabbitlistener; impor org.springframework.stereotype./*** @Author zhang bo*/ @ @value = "Toberever @RabbitListener (queuees = "#{autodeletequeue0.name}") public void receiver0 (string str) {System.out.println ("receiver0 +++++++++++:"+str); // coba {// thread.sleep (1000); //} catch (InterruptedException e) {// e.printstacktrace (); //}} @rabbitListener (queues = "#{autodeletequeUe1.name}") public void receiver1 (string str) {System.out.println ("receiver1 ++++++++++:"+str); // coba {// thread.sleep (1000); //} catch (InterruptedException e) {// e.printstacktrace (); //}}} Send.java
Paket com.zb.rabbitmqtest.t5topics.send; impor org.springframework.amqp.core.topicexchange; impor org.springframework.amqp.rabbit.core.rabbittemplate; impor org.springframework.beansfactory org.springframework.stereotype.component;/*** @author zhang bo*/ @component (value = "t5send") kelas publik kirim {@autowired private topicexchange topicexchange; @Autowired Private Rabbittemplate Rabbittemplate; Private String [] keys = {"quick.orane.rabbit", "lazy.orane.elephant", "quick.orane.fox", "lazy.brown.fox", "lazy.pink.rabbit", "quick.brown.fox"}; public void send () {string message = "hahaha"; untuk (int i = 0; i <5; i ++) {System.out.println ("Kirim ++++++++++++++:". Concat (pesan)); rabbittemplate.convertandsend (topicexchange.getname (), keys [5], pesan); }}} Sendtest.java
Paket com.zb.rabbitmqtest.t5topics.send; impor org.junit.test; impor org.junit.runner.runwith; impor org.springframework.beans.factory.annotation.Autowired; Impor org.springframework.boot.test.testest org.springframework.test.context.junit4.springrunner;/*** @author zhang bo*/ @runwith(springrunner.class)@springboottestpublic class sendtest {@Autowired send Send Send; @Test public void send () melempar pengecualian {send.send (); }}Saya tidak akan meninggalkan hasil tes, silakan periksa sendiri.
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.