En el artículo anterior, implementamos la configuración flexible del sistema de mensajes. En lugar de usar una configuración de interruptor de basura. Use interruptores directos y tenga la capacidad de recibir mensajes selectivamente después de las claves de enrutamiento.
Aunque el uso de interruptores de conexión directa puede mejorar nuestro sistema, todavía tiene limitaciones y no puede implementar múltiples condiciones de enrutamiento.
En nuestro sistema de mensajería, queremos suscribirnos no solo a una cola basada en la clave de enrutamiento, sino también a una fuente basada en mensajes de producción. Estos conceptos provienen de UNIX Tool Syslog. Este registro se basa en métodos de enrutamiento estrictos (info/warn/cr ...) y fácil (auth/cron/kern ...). Nuestro ejemplo es más simple que este.
Este ejemplo nos dará mucha flexibilidad, por ejemplo, queremos escuchar los registros de errores 'cron' y todos los registros de 'kern'.
Para lograr esta flexibilidad, necesitamos saber más sobre los interruptores de temas.
Cambio de tema
Cuando usa un Switch Topic, no puede usar claves de enrutamiento arbitrarias. El formato de la clave de enrutamiento debe ser palabras divididas por puntos. Cualquier palabra que use generalmente puede expresar el significado. Por ejemplo "stock.usd.nyse", "nyse.vmw", "Quick.orange.rabbit". Pero el tamaño de la palabra se limita a un máximo de 255 bytes.
Use el cambio de tema para definir claves de enrutamiento para prestar atención a 2 puntos
Definir claves de enrutamiento que coincidan con el interruptor del tema
En este ejemplo, enviaremos todos los mensajes que describan el animal. Este mensaje se enviará junto con una clave de enrutamiento compuesta de 3 palabras y 2 puntos. La primera palabra es expresar la velocidad, el segundo describe el color y el tercero describe el tipo: "<Speed>. <Color>. <pecies>".
Cree tres tipos de enlaces, Q1 y la clave "*.orange.*" Enlace, Q2 y "*.*. Conejo" y "Lazy.#" Binding.
Una descripción general de las tres relaciones vinculantes es:
Se pasará un mensaje con la clave de enrutamiento establecida en "Quick.Orange.Rabbit" a las colas Q1 y Q2. Lo mismo ocurre con "lazy.orange.elefant" también. "Quick.orange.fox" irá a la primera cola, "Lazy.brown.fox" irá a la segunda cola, y "Lazy.pink.rabbit" irá a la segunda cola a tiempo. Coincide con 2 enlaces. "Quick.brown.fox" se descartará debido a la falta de coincidencia.
Entonces, ¿qué pasa con "Orange" y "Quick.orange.male.rabbit"? Debido a que no se combina la vinculación, se descartará.
Entonces, ¿qué pasa con las claves de enrutamiento de "lazy.orange.male.rabbit"? , ya que perezoso.# coincides esto se pasará a la segunda cola.
Consejos para intercambiadores de temas
El cambio de tema es increíble y actúa similar a otros interruptores.
Ejemplo de código
El código no es diferente del código de enrutamiento anterior, consulte
Config.java
paquete com.zb.rabbitmqtest.t5topics.config; import org.springframework.amqp.core.*; importar org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration;/***@author zhang bo*/ @configuration (value (valore (valore = "T5Config") Public Class Config {/*** creado por: Zhang Bo* Tiempo: 2018/3/5 10:45 AM* @apinote Define Topic Exchange*/@Bean public topicExchange topiceXchange () {return new topiceXchange ("topic-exchange"); }/*** Creador: Zhang Bo* Tiempo: 2018/3/5 10:48 AM* @apinote Definición para eliminar automáticamente la cola anónima*/@Bean Public Queue Autodeletequeue0 () {return New AnonyMoqueue (); }/*** Creador: Zhang Bo* Tiempo: 2018/3/5 10:48 AM* @apinote Definición para eliminar automáticamente la cola anónima*/@Bean Public Queue Autodeletequeue1 () {return New AnonyMoqueue (); } /** * 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 (autodeletequeue0) .to (topicexchange) .with ("*. naranja.*"); }/*** Creado por: Zhang Bo* Tiempo: 3/3/3/5 10:48 AM* @param TopicExchange Switch* @param autodeLetequeue1 Eliminar automáticamente la cola* @apinote enlace usando la autodeLetequeue1 con la tecla de enrutamiento negra a la unión* @return de la rejilla*/@bean binking de enlace público (topicexchate topice, topice, queue, queue, queue -switche a la unión* @return*/@bean pública. autodeletequeue1) {return bindingBuilder.bind (autodeLetequeue1) .to (topicexchange) .with ("*.*. conejo"); } /** * 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 ("perezoso.#"); }} Receptor.java
paquete com.zb.rabbitmqtest.t5topics.receiver; import org.springframework.amqp.rabbit.annotation.rabbitListener; import org.springframework.stereotype.component;/*** @author zhang bo*/ @componente (valor = "t5Receiver") @RabBitListener (queues = "#{autodeLetequeue0.name}") public void receper0 (string str) {system.out.println ("receper0 ++++++++++++:"+str); // intenta {// thread.sleep (1000); //} Catch (InterruptedException e) {// E.PrintStackTrace (); //}} @RabBitListener (queues = "#{autodeLetequeue1.name}") public void receper1 (String str) {System.out.println ("receper1 ++++++++++++++:"+str); // intenta {// thread.sleep (1000); //} Catch (InterruptedException e) {// E.PrintStackTrace (); //}}} Send.java
paquete com.zb.rabbitmqtest.t5topics.send; import org.springframework.amqp.core.topicexchange; import org.springframework.amqp.rabbit.core.rabbittemplate; import og.springframework.beans.aannotation.autowired; import org. @Autowired privado rabbittemplate rabbittemplate; String private [] keys = {"Quick.orange.rabbit", "lazy.orange.elephant", "Quick.orange.fox", "Lazy.brown.fox", "Lazy.pink.rabbit", "Quick.brown.fox"}; public void send () {String Message = "JAHAHA"; for (int i = 0; i <5; i ++) {System.out.println ("Enviar ++++++++++++++:". Concat (mensaje)); rabbittemplate.convertandsend (topiceExchange.getName (), claves [5], mensaje); }}} SendTest.java
paquete com.zb.rabbitmqtest.t5topics.send; import org.junit.test; import org.junit.runner.runwith; import org.springframework.beans.factory.annotation.aUtowired; import og.sspingframework.boot.test.context.springboott; import org.springframework.test.context.junit4.springrunner;/*** @author zhang bo*/ @runwith(springrunner.class)@springboottestpublic class sendTest {@aUtowired private envío; @Test public void send () lanza excepción {send.send (); }}No dejaré los resultados de la prueba, por favor revise usted mismo.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.