No artigo anterior, implementamos a configuração flexível do sistema de mensagens. Em vez de usar uma configuração de switch de fanout. Use comutadores diretos e tenha a capacidade de receber seletivamente mensagens após as teclas de roteamento.
Embora o uso de comutadores de conexão direta possa melhorar nosso sistema, ele ainda possui limitações e não pode implementar o roteamento de várias condições.
Em nosso sistema de mensagens, queremos assinar não apenas uma fila de roteamento baseada em chave, mas também em uma fonte baseada em mensagens de produção. Esses conceitos vêm do Unix Tool Syslog. Este registro é baseado em métodos de roteamento rigorosos (info/warn/crit ...) e fácil (auth/cron/kern ...). Nosso exemplo é mais simples que este.
Este exemplo nos dará muita flexibilidade, por exemplo, queremos ouvir os logs de erro 'Cron' e todos os logs de 'Kern'.
Para alcançar essa flexibilidade, precisamos saber mais sobre os interruptores de tópicos.
Interruptor de tema
Ao usar uma chave de tópico, você não pode usar as teclas de roteamento arbitrárias. O formato da chave de roteamento deve ser as palavras divididas por pontos. Qualquer palavra que você usa geralmente pode expressar o significado. Por exemplo, "stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit". Mas o tamanho da palavra é limitado a um máximo de 255 bytes.
Use o comutador de tema para definir teclas de roteamento para prestar atenção a 2 pontos
Defina chaves de roteamento que correspondem ao interruptor do tópico
Neste exemplo, enviaremos todas as mensagens que descrevem o animal. Esta mensagem será enviada juntamente com uma chave de roteamento composta por 3 palavras e 2 pontos. A primeira palavra é expressar velocidade, a segunda descreve a cor e a terceira descreve o tipo: "<speed>.
Crie três tipos de ligações, Q1 e a chave "*.Range.*" Vinculação, Q2 e "*.*. Rabbit" e "Lazy.#" Ligação.
Uma visão geral dos três relacionamentos de ligação é:
Uma mensagem com a chave de roteamento definida como "Quick.orange.rabbit" será passada para as filas Q1 e Q2. O mesmo vale para "preguiçoso.orange.elephant" também. "quick.orange.fox" irá para a primeira fila, "lazy.brown.fox" irá para a segunda fila, e "preguiçoso.pink.rabbit" irá para a segunda fila no tempo. Combina 2 ligações. "Quick.brown.fox" será descartado por causa da incompatibilidade.
E quanto a "Orange" e "Quick.orange.male.rabbit"? Como nenhuma ligação é comparada, ela será descartada.
Então, e as chaves de roteamento de "lazy.orange.male.rabbit"? , como preguiçoso.# Combine isso será passado para a segunda fila.
Dicas para trocadores de temas
A mudança de tema é incrível e age semelhante a outros comutadores.
Exemplo de código
O código não é diferente do código de roteamento anterior, consulte
Config.java
pacote com.zb.rabbitmqtest.t5topics.config; importar org.springframework.amqp.core.*; importar org.springframework.context.annotation.bean; importen; "t5config") public classe config {/*** criada por: zhang bo* time: 2018/3/5 10:45* @apinote define tópica troca*/@Bean public topicexchange topicexChange () {return topicexchange ("tópico-Exchange"); }/*** Criador: Zhang Bo* Hora: 2018/3/5 10:48* @apinote Defina a exclusão automática da fila anônima*/@Bean public fila AutoDeleteQueue0 () {retorna novo anonymousQueue (); }/*** Criador: Zhang Bo* Hora: 2018/3/5 10:48* @apinote Defina a deleção automática da fila anônima*/@Bean public fila AutoDeleteQueue1 () {retorna novo 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 (AUTODODELETEQUEUE0) .to (topicexchange) .with ("*. Orange.*"); }/*** Criado por: Zhang bo* HORA: 2018/3/5 10:48* @param topicexchange switch de tema* @param automatodeletequeue1 exclua automaticamente a fila* @apinote ligando a ligação de tapão Autodeleteue1 com a chave de roteamento para a chave de tópico* @ECHEXTING*/BEMETIMENTO PUBLUINE 1 AUTODELETEQUEUE1) {return bindingbuilder.bind (AUTODODELETEQUEUE1) .to (topicexchange) .with ("*.*. Rabbit"); }/*** Criado por: Zhang bo* Hora: 2018/3/5 10:48* @param topicexchange switch de tema* @param Autodeletequeue1 Excluindo automaticamente a fila* @Apinote Binding Binding1 Binding1 Binding1 para fazer a fila para a troca de tópicos* @returning TopanManMange, o TopingChing Binding1B) AUTODELETEQUEUE1) {return bindingbuilder.bind (AUTODODELETEQUEUE1) .to (topicexchange) .with ("Lazy.#"); }} Receptor.java
pacote com.zb.rabbitmqtest.t5topics.receiver; importar org.springframework.amqp.rabbit.annotation.rabbitListener; importar org.springframework.tereotype.component;/*** @author zhang bo*/ @componente (value = "TRON) @RabbitListener (fileues = "#{AUTODELETEQUEUE0.NAME}") public void receiver0 (String str) {System.out.println ("receiver0 +++++++++++:"+str); // tente {// thread.sleep (1000); //} catch (interruptEdException e) {// e.printStackTrace (); //}} @rabbitListener (fileues = "#{AUTODELETEQUEUE1.NAME}") public void Receiver1 (String str) {System.out.println ("receptor1 +++++++++++:"+str); // tente {// thread.sleep (1000); //} catch (interruptEdException e) {// e.printStackTrace (); //}}} Send.java
pacote com.zb.rabbitmqtest.t5topics.send; importar org.springframework.amqp.core.topicexchange; importar org.springframework.amqp.rabbit.core.rabbittemplate; importar.springframework.banky.annotation.annotation; org.springframework.stereotype.component;/*** @author zhang bo*/ @componente (value = "t5send") classe pública envia {@aUTowired TopicexChange privado 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"; for (int i = 0; i <5; i ++) {System.out.println ("send +++++++++++:". concat (message)); rabbittemplate.convertandSend (topicexchange.getName (), chaves [5], mensagem); }}} SendTest.java
package com.zb.rabbitMQtest.t5topics.send;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import 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 (); }}Não vou deixar os resultados dos testes, verifique você mesmo.
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.