Im vorherigen Artikel haben wir die flexible Konfiguration des Nachrichtensystems implementiert. Anstatt eine Fanout -Switch -Konfiguration zu verwenden. Verwenden Sie direkte Switches und können Sie nach dem Routing von Schlüsseln selektiv Nachrichten empfangen.
Obwohl die Verwendung von Direktverbindungsschaltern unser System verbessern kann, weist es weiterhin Einschränkungen auf und kann mehrere Bedingungen Routing nicht implementieren.
In unserem Messaging-System möchten wir nicht nur eine routing-basierte Warteschlange, sondern auch für eine produktionsbasierte Quelle abonnieren. Diese Konzepte stammen aus dem Unix -Toolsyslog. Dieses Protokoll basiert auf strikten (info/warn/krit ...) und einfachen (auth/cron/kern ...) Routing -Methoden. Unser Beispiel ist einfacher als dieses.
Dieses Beispiel gibt uns viel Flexibilität. Zum Beispiel möchten wir sowohl die "Cron" -Fehlerprotokolle als auch alle Protokolle von 'Kern' anhören.
Um diese Flexibilität zu erreichen, müssen wir mehr über Themenschalter erfahren.
Themenschalter
Wenn Sie einen Themenschalter verwenden, können Sie keine beliebigen Routing -Tasten verwenden. Das Format des Routing -Schlüssels sollte Wörter sein, die durch Punkte geteilt werden. Jedes Wort, das Sie verwenden, kann normalerweise die Bedeutung ausdrücken. Zum Beispiel "stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit". Die Wortgröße ist jedoch auf maximal 255 Bytes beschränkt.
Verwenden Sie den Themenschalter, um Routing -Schlüssel zu definieren, um 2 Punkte zu achten
Definieren Sie Routing -Schlüssel, die mit dem Themenschalter übereinstimmen
In diesem Beispiel senden wir alle Nachrichten, die das Tier beschreiben. Diese Nachricht wird mit einem Routing -Schlüssel gesendet, der aus 3 Wörtern und 2 Punkten besteht. Das erste Wort ist, die Geschwindigkeit auszudrücken, das zweite die Farbe und der dritte beschreibt Typ: "<speed>. <farben>. <spezies>".
Erstellen Sie drei Arten von Bindungen, Q1 und den Schlüssel "*.Orange.*" Bindung, Q2 und "*.*. Rabbit" und "Lazy.#" Bindung.
Ein Überblick über die drei verbindlichen Beziehungen lautet:
Eine Nachricht mit dem Routing -Schlüssel auf "Quick.orange.rabbit" wird an die Queues Q1 und Q2 übergeben. Gleiches gilt auch für "Lazy.orange.elephant". "Quick.Orange.fox" wird zur ersten Warteschlange "Lazy.brown.Fox" zur zweiten Warteschlange gehen, und "Lazy.pink.rabbit" wird rechtzeitig zur zweiten Warteschlange gehen. Es entspricht 2 Bindungen. "Quick.brown.Fox" wird wegen Nichtübereinstimmung verworfen.
Was ist also mit "Orange" und "Quick.orange.mal.rabbit"? Da keine Bindung übereinstimmt, wird sie verworfen.
Was ist also mit den Routing -Schlüssel von "Lazy.orange.mal.rabbit"? Da faul.# passt, dass dies an die zweite Warteschlange übergeben wird.
Tipps für Themenaustauscher
Der Themenschalter ist großartig und ähnelt anderen Switches.
Codebeispiel
Der Code unterscheidet sich nicht vom vorherigen Routing -Code, siehe bitte
Config.java
paket com.zb.rabbitmqtest.t5topics.config; import org.springframework.amqp.core. "T5Config") öffentliche Klasse config {/*** Erstellt von: Zhang Bo* Zeit: 2018/3/5 10:45 Uhr* @APinote themenaustausch*/@Bean publicExChange topicexchange () {Neue topicexchange zurückgeben ("topic-exchange"); }/*** Ersteller: Zhang bo* Zeit: 2018/3/5 10:48 Uhr* @APinote Definition, um die anonyme Warteschlange automatisch zu löschen. }/*** Ersteller: Zhang bo* Zeit: 2018/3/5 10:48 Uhr* @APinote Definition, um die anonyme Warteschlange automatisch zu löschen }/*** Erstellt von: Zhang bo* Zeit: 2018/3/5 10:48 Uhr* @param topicexchange Theme Switch* @param autodeletequeue0 automatisch die Warteschlange löschen* @apinote Bindung Verwenden Sie den Routing -Schlüssel Orange, um das Topicexchanking -Bindungsbindung zu erhalten. autodeletequeue0) {return bindingBuilder.bind (autodeletequeue0) .to (topicexchange) .with ("*. Orange.*"); }/*** Erstellt von: Zhang bo* Zeit: 2018/3/5 10:48 AM* @param topicexchange Theme Switch* @param autodeletequeue1 automatisch die Warteschlange* @apinote Bindung mit dem Autodeletequeue1 mit dem Routing -Taste zum Thema themenwechsel* @retrack Bindung*/@Bean Binding Binding1a (topicange topiceurn binding binding binding binding binding binding) autodeletequeue1) {return bindingBuilder.bind (autodeletequeue1) .to (topicexchange). -with ("*.*. Rabbit"); } /** * 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 ("faul.#"); }} Receiver.java
paket com.zb.rabbitmqtest.t5topics @RabbitListener (queues = "#{autodeletequeue0.name}") public void receiver0 (string str) {System.out.println ("receiver0 +++++++++++:"+str); // try {// thread.sleep (1000); //} catch (InterruptedException e) {// e.printstacktrace (); //}} @rabbitListener (queues = "#{autodeletequeue1.name}") public void receiver1 (string str) {system.out.println ("receiver1 ++++++++++++:"+str); // try {// thread.sleep (1000); //} catch (InterruptedException e) {// e.printstacktrace (); //}}} Send.java
Paket com.zb.rabbitmqtest.t5topics org.springframework.stereotype.comPonent;/*** @Author Zhang bo*/ @component (value = "t5Send") öffentliche Klasse Senden {@autowired private topicexchange topicexchange; @Autowired Private Rabbittemplate Rabbittemplate; private String [] keys = {"Quick.orange.rabbit", "Lazy.orange.elephant", "Quick.orange.fox", "Lazy.brown.fox", "Lazy.pink.rabbit", "Quick.brown.Fox"}; public void send () {String message = "hahaha"; für (int i = 0; i <5; i ++) {system.out.println ("Senden +++++++++++:". concat (message)); Rabbittemplate.ConvertandSend (topicexChange.getName (), Keys [5], Nachricht); }}} Sendest.java
paket com.zb.rabbitmqtest.t5topics.send; import org.junit.test; import org.junit.runner org.springframework.test.context.junit4.springrunner;/*** @Author Zhang bo*/ @runwith(springrunner.class)@springBoottestpublic Class Sendest {@autowired privat send; @Test public void send () löst Ausnahme aus {send.send (); }}Ich werde die Testergebnisse nicht verlassen, bitte überprüfen Sie es selbst.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.