前の記事では、メッセージシステムの柔軟な構成を実装しました。ファンアウトスイッチ構成を使用する代わりに。ダイレクトスイッチを使用して、キーをルーティングした後にメッセージを選択的に受信する機能を持っています。
直接接続スイッチを使用するとシステムが改善できますが、制限があり、複数の条件ルーティングを実装することはできません。
メッセージングシステムでは、ルーティングキーベースのキューだけでなく、生産メッセージベースのソースにも購読したいと考えています。これらの概念は、UNIXツールSyslogからのものです。このログは、厳格(情報/ワーン/クリティカル...)および簡単(auth/cron/kern ...)ルーティング方法に基づいています。私たちの例はこれよりも簡単です。
この例では、多くの柔軟性が得られます。たとえば、「Cron」エラーログと「Kern」からのすべてのログの両方を聞きたいと思います。
この柔軟性を実現するには、トピックスイッチについてもっと知る必要があります。
テーマスイッチ
トピックスイッチを使用する場合、任意のルーティングキーを使用することはできません。ルーティングキーの形式は、単語をポイントで分割する必要があります。使用する単語は、通常、意味を表現できます。たとえば、「stock.usd.nyse」、「nyse.vmw」、「Quick.orange.rabbit」。ただし、単語のサイズは最大255バイトに制限されています。
テーマスイッチを使用してルーティングキーを定義して2ポイントに注意を払う
トピックスイッチに一致するルーティングキーを定義します
この例では、動物を説明するすべてのメッセージを送信します。このメッセージは、3語と2ポイントで構成されるルーティングキーと一緒に送信されます。最初の単語は速度を表現することで、2番目は色を表し、3番目はタイプ「<speed>。<color>。<peces>」を説明します。
3種類のバインディング、Q1とキー「*.orange。*」バインディング、Q2および「*。*。ラビット」および「lazy。#」バインディングを作成します。
3つの結合関係の概要は、次のとおりです。
「Quick.Orange.Rabbit」に設定されたルーティングキーを使用したメッセージは、Q1およびQ2キューに渡されます。 「lazy.orange.elephant」についても同じことが言えます。 「Quick.Orange.Fox」は最初のキューに移動し、 "lazy.brown.fox"が2番目のキューに移動し、「lazy.pink.rabbit」は2番目のキューに時間内に進みます。 2つのバインディングと一致します。 「Quick.Brown.Fox」は不一致のために破棄されます。
では、「オレンジ」と「Quick.orange.male.rabbit」はどうですか?結合が一致しないため、破棄されます。
では、「lazy.orange.male.rabbit」のルーティングキーはどうですか? 、怠zy。#一致するので、これは2番目のキューに渡されます。
テーマ交換器のためのヒント
テーマスイッチは素晴らしく、他のスイッチに似ています。
コードの例
コードは以前のルーティングコードと違いはありません。
config.java
パッケージcom.zb.rabbitmqtest.t5topics.config; import org.springframework.amqp.core。*; import org.springframework.context.annotation.bean; Import org.springframework.context.annotation.configuration; 「T5Config」)パブリッククラスconfig {/***作成:Zhang bo* time:2018/3/5 10:45 am* @Apinote Define Topy Exchange*/@Bean public topicexchange topicexchange(){return new topicexchange( "Topic-Exchange"); }/***作成者:Zhang bo*時間:2018/3/5 10:48 am* @Apinote Define匿名キューの自動削除*/@bean public queue autodeletequeue0(){return new Anonymousqueue(); }/***作成者:Zhang bo*時間:2018/3/5 10:48 am* @Apinote define anonymous queueの自動削除*/@bean public queue autodeletequeue1(){return new Anonymousqueue(); }/***作成者:Zhang bo* time:2018/3/5 10:48 am* @param topicexchangeテーマスイッチ* @param autodeletequeuee0 @apinote bindingルーティングキーオレンジを使用してトピックスイッチにキューにバインディングします。 autodeletequeue0){binding bindingbuilder.bind(autodeletequeue0).to(topicexchange).with( "*。orange。*"); }/***作成者:Zhang bo*時間:2018/3/5 10:48 am* @param topicexchangeテーマスイッチ* @param autodeletequeue1は、キーをルーティングキースイッチとともにautodeletequeue1を使用してqueueを自動的に削除します。 autodeletequeue1){binding bindingbuilder.bind(autodeletequeue1).to(topicexchange).with( "*。*。rabbit"); }/***作成者:Zhang bo*時間:2018/3/5 10:48 am* @param topicexchangeテーマスイッチ* @param autodeletequeue1 @apinote bindingルーティングキーグリーンを使用してトピックスイッチへのキューにキューにバインディングします。 autodeletequeue1){binding bindingbuilder.bind(autodeletequeue1).to(topicexchange).with( "lazy。#"); }} Receiver.java
パッケージcom.zb.rabbitmqtest.t5topics.receiver; Import org.springframework.amqp.rabbit.annotation.rabbitlistener; Import org.springframework.stereotype.component;/*** @author zhang bo*/ @componen @rabbitlistener(queues = "#{autodeletequeue0.name}")public void receiver0(string str){system.out.println( "Receiver0 ++++++++++++:"+str); // try {// thread.sleep(1000); //} catch(arturnedexception e){// e.printstacktrace(); //}} @rabbitlistener(queues = "#{autodeletequeue1.name}")public void receiver1(string str){system.out.println( "Receiver1 +++++++++++++:"+str); // try {// thread.sleep(1000); //} catch(arturnedexception e){// e.printstacktrace(); //}}} send.java
パッケージcom.zb.rabbitmqtest.t5topics.send; import org.springframework.amqp.core.topicexchange; Import org.springframework.amqp.rabbit.core.rabbittemplate; Import org.springframework.beans.beans.beans.Annotation.Annotation.Annotation. org.springframework.stereotype.component;/*** @author zhang bo*/ @component(value = "t5send")public class send {@autowired private topicexchange topicexchange; @Autowiredプライベート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"; for(int i = 0; i <5; i ++){system.out.println( "send ++++++++++++++:"。concat(message)); rabbittemplate.convertandsend(topicexchange.getname()、keys [5]、message); }}} sendtest.java
パッケージcom.zb.rabbitmqtest.t5topics.send; import org.junit.test; import org.junit.runner.runwith; import org.springframework.beans.factory.annotation.autowired; import org.springframework.test.context.context.context.context.context.context.context.context.context.context.context.context.contex org.springframework.test.context.junit4.springrunner;/*** @author zhang bo*/ @runwith(springrunner.class)@springboottestpublic class sendtest {@autowired private send; @test public void send()throws Exception {send.send(); }}テスト結果は残さないので、自分でチェックしてください。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。