이전 기사에서는 메시지 시스템의 유연한 구성을 구현했습니다. 팬 아웃 스위치 구성을 사용하는 대신. 직접 스위치를 사용하고 라우팅 키 후 메시지를 선택적으로 수신 할 수 있습니다.
직접 연결 스위치를 사용하면 시스템이 향상 될 수 있지만 여전히 제한 사항이 있으며 여러 조건 라우팅을 구현할 수 없습니다.
메시징 시스템에서는 라우팅 키 기반 큐뿐만 아니라 제작 메시지 기반 소스에도 구독하고자합니다. 이러한 개념은 Unix Tool Syslog에서 나옵니다. 이 로그는 엄격한 (Info/Warn/Crit ...) 및 Easy (Auth/Cron/Kern ...) 라우팅 방법을 기반으로합니다. 우리의 예는 이것보다 간단합니다.
이 예제는 우리에게 많은 유연성을 제공합니다. 예를 들어, 'Cron'오류 로그와 'kern'의 모든 로그를 모두 듣고 싶습니다.
이러한 유연성을 달성하려면 주제 스위치에 대해 더 알아야합니다.
테마 스위치
주제 스위치를 사용하는 경우 임의의 라우팅 키를 사용할 수 없습니다. 라우팅 키의 형식은 단어를 점으로 나눈 값이어야합니다. 사용하는 모든 단어는 일반적으로 의미를 표현할 수 있습니다. 예를 들어 "Stock.usd.nyse", "nyse.vmw", "Quick.orange.Rabbit"입니다. 그러나 단어 크기는 최대 255 바이트로 제한됩니다.
테마 스위치를 사용하여 라우팅 키를 정의하여 2 점에주의를 기울입니다.
주제 스위치와 일치하는 라우팅 키를 정의하십시오
이 예에서는 동물을 설명하는 모든 메시지를 보낼 것입니다. 이 메시지는 3 단어와 2 점으로 구성된 라우팅 키와 함께 전송됩니다. 첫 번째 단어는 속도를 표현하는 것입니다. 두 번째 단어는 색상을 설명하고 세 번째는 유형을 설명합니다.
3 가지 유형의 바인딩과 키 "*.orange.*"바인딩, Q2 및 "*.*. 토끼"및 "Lazy.#"바인딩을 만듭니다.
세 가지 바인딩 관계에 대한 개요는 다음과 같습니다.
라우팅 키가 "Quick.orange.Rabbit"으로 설정된 메시지가 Q1 및 Q2 대기열로 전달됩니다. "lazy.orange.elephant"도 마찬가지입니다. "Quick.orange.fox"는 첫 번째 대기열로 이동하면 "Lazy.brown.fox"가 두 번째 대기열로 이동하고 "Lazy.pink.rabbit"은 제 시간에 두 번째 대기열로 이동합니다. 2 개의 바인딩과 일치합니다. "Quick.brown.fox"는 불일치로 인해 폐기됩니다.
그렇다면 "Orange"와 "Quick.orange.male.rabbit"은 어떻습니까? 바인딩이 일치하지 않기 때문에 폐기됩니다.
그렇다면 "lazy.orange.male.rabbit"의 라우팅 키는 어떻습니까? , Lazy.# 일치하기 때문에 이것은 두 번째 줄로 전달됩니다.
테마 교환기를위한 팁
테마 스위치는 훌륭하고 다른 스위치와 비슷합니다.
코드 예제
코드는 이전 라우팅 코드와 다르지 않습니다.
config.java
com.zb.rabbitmqtest.t5topics.config; import org.springframework.amqp.core.*; import org.spramframework.context.annotation.bean; import org.springframework.context.annotation.configuration;/** @author zhang bo*/ @ @ @ @ @ @springor zhang bo*/ @author zhang zhang zhang zhang zhang zhang zhang zhang zhang zhang. "t5config") public class config {/*** 작성자 : Zhang Bo* 시간 : 2018/3/5 10:45 AM* @apinote 정의 주제 교환*/@bean public topicexchange topicexchange () {return new topicexchange ( "topic-exchange"); }/*** Creator : Zhang Bo* 시간 : 2018/3/5 10:48 AM* @apinote 정의 익명 대기열을 자동으로 삭제하려면*/@bean public queue autodeletequeue0 () {return new Anonymousqueue (); }/*** Creator : Zhang Bo* 시간 : 2018/3/5 10:48 AM* @apinote 정의 익명 대기열을 자동으로 삭제하려면*/@bean public queue autodeletequeue1 () {return new Anonymousqueue (); }/*** 작성자 : Zhang Bo* Time : 2018/3/5 10:48 AM* @Param TopiceXChange 테마 스위치* @Param AutoDeletequeue0 Queue* @apinote 바인딩 주제 스위치에 라우팅 키 오렌지를 사용하십시오* @Bean public binding0a (topicexchange, topicexchange, topicexchange, topicexchange). autodeletequeue0) {return bindingbuilder.bind (autodeletequeue0) .to (topicexchange) .with ( "*. Orange.*"); }/*** 작성자 : Zhang Bo* 시간 : 2018/3/5 10:48 AM* @Param topicexchange 테마 스위치* @param autodeletequeue1 라우팅 키 블랙과 함께 autodeletequeue1을 사용하여 큐* @apinote 바인딩을 자동으로 삭제*/@Bean 바인딩*/@bean vinding1a autodeletequeue1) {return bindingbuilder.bind (autodeletequeue1) .to (topicexchange) .with ( "*.*. Rabbit"); }/*** 작성자 : Zhang Bo* Time : 2018/3/5 10:48 AM* @Param TopiceXChange 테마 스위치* @Param AutoDeletequeue1 큐를 자동으로 삭제* @apinote 바인딩 주제 스위치에 라우팅 키 녹색을 Queue로 사용하십시오* @bean public binding1b (Topicexchange, topicexchange, topicexchange, topicexchange) autodeletequeue1) {return bindingbuilder.bind (autodeletequeue1) .to (topicexchange) .with ( "lazy.#"); }} 수신기. 자바
com.zb.rabbitmqtest.t5topics.receiver; import org.springframework.amqp.rabbit.annotation.rabbitlistener; import org.spramframework.stereotyp.component;/*** @author zhang bo*/ @component (value classe = "))). @RabBitListener (queues = "#{autodeletequeue0.name}") public void receiver0 (String) {system.out.println ( "수신기 0 +++++++++++ :"+str); // try {// thread.sleep (1000); //} catch (InterruptedException e) {// e.printstacktrace (); //}} @RabbitListener (queues = "#{autodeletequeue1.name}") public void receiver1 (String) {system.out.println ( "수신기 1 +++++++++++ :"+str); // try {// thread.sleep (1000); //} catch (InterruptedException e) {// e.printstacktrace (); //}}} send.java
package com.zb.rabbitmqtest.t5topics.send; import org.springframework.amqp.core.topicexchange; import org.springframework.amqp.rabbit.core.rabbittemplate; import org.springframework.beans.annotation.autowireat; org.springframework.stereotyp.component;/*** @author zhang bo*/ @component (value = "t5send") public class and {@autowired private topicexchange topicexchange; @autowired private rabbittemplate 토끼를 찍는다; 개인 문자열 [] keys = { "Quick.orange.Rabbit", "Lazy.Orange.eLephant", "Quick.Orange.Fox", "Lazy.Brown.fox", "Lazy.pink.rabbit", "Quick.brown.fox"}; public void send () {문자열 메시지 = "hahaha"; for (int i = 0; i <5; i ++) {system.out.println ( "+++++++++++++ :". concat (메시지)); Rabbittemplate.convertandSend (topicexchange.getName (), 키 [5], 메시지); }}} sendtest.java
package com.zb.rabbitmqtest.t5topics.send; import org.junit.test; import org.junit.runner.runwith; import org.springframework.beans.actory.annotation.autowired; import org.springframework.boot.test.context.spridertest; org.springframework.test.context.junit4.springrunner;/*** @author zhang bo*/ @runwith(springrunner.class)@springboottestpublic class sendtest {@autowired 개인 보내기 보내기; @test public void send ()는 예외 {send.send (); }}테스트 결과를 남기지 않겠습니다. 직접 확인하십시오.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.