No tutorial anterior, criamos um switch de fanout. Podemos entregar a mensagem a vários consumidores na forma de transmissão.
O que fazer? Roteamento
Neste tutorial, adicione um novo recurso onde podemos assinar apenas parte da mensagem. Por exemplo, apenas as cores em que estamos interessados ("laranja", "preto", "verde") serão conectados e todas as mensagens serão impressas no console.
Vincular
Um interruptor e uma fila são um relacionamento vinculativo. Um entendimento simples é que a fila está interessada nas informações desta troca.
A ligação pode ser adicionada com um parâmetro extra RotingKey. O Spring-AMQP usa uma API simples e fácil de entender (modo Builder) para tornar a relação entre eles muito clara. Colocando o interruptor e a fila no BindingBuilder e vinculando a fila ao interruptor facilmente com a chave de roteamento (RoutingKey).
@BeanPublic Binding binding0a (DirectExChange DirectExChange, fila AUTODODELETEQUEUE0) {return bindingbuilder.bind (autodeletequeue0) .to (diretorxchange) .with ("laranja");}Isso significa que a tecla de ligação depende do tipo de comutador, e o interruptor de fanout não pode fazê -lo sem opções que podem ser vinculadas.
Chave de conexão direta
No tutorial anterior, nosso sistema de mensagens foi entregue a todos os consumidores na forma de transmissão. Queremos expandir os recursos para incluir filtros com base em tipos de cores. Por exemplo, queremos que um programa receba mensagens de erro detalhadas e escreva -as no disco rígido como um log, sem receber informações ou logs de aviso.
Três chaves de roteamento: laranja, preto e verde
Como mostrado na figura acima, existem 2 filas ligadas à troca de conexão direta x. A primeira fila usa as teclas de roteamento é laranja e a segunda possui 2 teclas de roteamento, preto e verde.
Nesta configuração, quando uma mensagem usando a tecla de roteamento é empurrada para o comutador, a mensagem será roteada para a fila Q1. Quando a chave de roteamento usada pela mensagem for preta ou verde, ela será roteada para o Q2. As mensagens restantes que não usam a chave de roteamento serão descartadas.
Ligação paralela
Ligação paralela
Isso pode implementar funções semelhantes aos interruptores de fanout.
Quase, olhe para o código
Config.java
pacote com.zb.rabbitmqtest.t4routing.config; importar org.springframework.amqp.core.*; importar org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuratur; "t4config") public classe config {/*** criada por: zhang bo* time: 2018/3/5 10:45* @apinote define troca conectada direta*/@Bean public DirectExChange DirectExChange () {return DirectExchange ("Direct-Exchange"); }/*** Criador: Zhang Bo* Hora: 2018/3/5 10:48* @apinote Definição para excluir automaticamente a fila anônima*/@Bean public fila AutoDeleteQueue0 () {retorna new anonymousQueue (); }/*** Criador: Zhang Bo* Hora: 2018/3/5 10:48* @apinote Definição para excluir automaticamente a fila anônima*/@Bean public fila AutoDeleteQueue1 () {return New AnnonymousQueue (); }/*** Criado por: Zhang bo* Hora: 2018/3/5 10:48* @Param DirectExChange Switch conectado direto* @param AUTODODELETEQUEUE0 Excluir automaticamente a fila* @Apinote Binding Usando a tecla de roteamento Lizing Lizeue para o botão de conexão direta* @returning*/@bean AUTODELETEQUEUE0) {return bindingbuilder.bind (AUTODODELETEQUEUE0) .to (DirectExChange) .with ("laranja"); } /** * Created by: Zhang Bo* Time: 2018/3/5 10:48 am * @param directExchange DirectExchange * @param autoDeleteQueue0 Automatically delete queue* @apiNote Binding using the routing key black queue to the direct switch* @return Binding */ @Bean public Binding binding0b(DirectExchange directExchange, Queue autoDeleteQueue0) { return bindingbuilder.bind (AUTODELETEQUEUE0) .to (DirectExChange) .With ("Black"); }/*** Criado por: Zhang bo* HORA: 2018/3/5 10:48* @param DirectExChange DirectExChange* @param AutoDeleteQueue1 Excluindo automaticamente a fila* @Apinote Binding Usando a liga direta de ligação direta* @ -Retwork, @Branding Binding Linding, que se liga a chave direta* @returning*/, @ @ @ @, @@banating linding binding Blacking to Blacking 1 Retwork* @return AUTODELETEQUEUE1) {return bindingbuilder.bind (AUTODODELETEQUEUE1) .to (DirectExChange) .with ("Black"); } /** * Created by: Zhang Bo* Time: 2018/3/5 10:48 am * @param directExchange DirectExchange * @param autoDeleteQueue1 Automatically delete queue* @apiNote Binding using the routing key green queue to the direct switch* @return Binding */ @Bean public Binding binding1b(DirectExchange directExchange, Queue autoDeleteQueue1) { retornar bindingbuilder.bind (AUTODELETEQUEUE1) .to (DirectExChange) .With ("Green"); }} Receptor.java
pacote com.zb.rabbitmqtest.t4routing.receiver; importar org.springframework.amqp.rabbit.annotation.rabbitListener; importar org.springframework.tereotype.component;/*** @author zhang bo*/ @componente (Value = "TREM.CONMONDEMENTE (** ** @Author Zhang Bo*/ @componente (Value =" TREMENTY.CONMONDEMEMENTE (** ** @author zhang bo*/ @componente (Value = "TREM.CONMONDEMEMENTE =" @RabbitListener (fileues = "#{AUTODELETEQUEUE0.NAME}") public void receiver0 (String str) {System.out.println ("receiver0 +++++++++++:"+str); } @RabbitListener (fileues = "#{AUTODELETEQUEUE1.NAME}") public void Receiver1 (String str) {System.out.println ("Receiver 1 +++++++++++:"+str); }} Send.java
pacote com.zb.rabbitmqtest.t4routing.send; importar org.springframework.amqp.core.directExchange; importar org.springframework.amqp.rabbit.core.rabbittemplate; importação.springFramework.BaRabbit.core.rabbittemplate; org.springframework.tereotype.component;/** * @author zhang bo 【[email protected]】 */ @componente (value = "t4send") classe pública envia {@autowired private DirectExChange; @Autowired Private Rabbittemplate Rabbittemplate; private string [] chaves = {"laranja", "preto", "verde"}; public void send () {string message = "hahaha"; for (int i = 0; i <5; i ++) {System.out.println ("send +++++++++++:". concat (message)); rabbittemplate.convertandSend (diretorxchange.getName (), chaves [2], mensagem); }}}
SendTest.java
pacote com.zb.rabbitmqtest.t4routing.send; importar org.junit.test; importar org.junit.runner.runwith; import org.springframework.beans.factory.annotation.autowired; importar.springFramework.Boot.Test.Test.CoT.Contet.CoNTEXTEXTOTEXTOTEXTOTEXTET.COTTOR.COT.CONTT.COTTOR.CONTTONTET.COOT.COT.COT.COTTOR.COTTOR.NOTEXTO; org.springframework.test.context.junit4.springrunner;/*** @author zhang bo*/ @runwith(springrunner.class)@springboottestPublic Classe sendTest {@Autowired Private Send Send; @Test public void send () lança a exceção {send.send (); }} Resultados dos testes: Se forem as chaves [0], então existe apenas o receptor0. Se forem as chaves [1], é semelhante à transmissão, com RECEBEM e RECEBEM1. Se forem as chaves [2], então haverá apenas 1.
Quando as chaves [0]
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Receiver0 +++++++++++++: hahahaha
Receiver0 +++++++++++++: hahahaha
Receiver0 +++++++++++++: hahahaha
Receiver0 +++++++++++++: hahahaha
Receiver0 +++++++++++++: hahahahaQuando as chaves [1]
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Receiver1 +++++++++++++: hahahaha
Receiver1 +++++++++++++: hahahaha
Receiver0 +++++++++++++: hahahaha
Receiver0 +++++++++++++: hahahaha
Receiver0 +++++++++++++: hahahaha
Receiver1 +++++++++++++: hahahaha
Receiver1 +++++++++++++: hahahaha
Receiver0 +++++++++++++: hahahaha
Receiver1 +++++++++++++: hahahaha
Receiver0 +++++++++++++: hahahahaQuando as chaves [2]
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Send ++++++++++++++: hahaha
Receiver1 +++++++++++++: hahahaha
Receiver1 +++++++++++++: hahahaha
Receiver1 +++++++++++++: hahahaha
Receiver1 +++++++++++++: hahahaha
Receiver1 +++++++++++++: hahahaha
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.