Dans l'article précédent, nous avons implémenté la configuration flexible du système de messages. Au lieu d'utiliser une configuration de commutateur Fanout. Utilisez des commutateurs directs et ayez la possibilité de recevoir sélectivement des messages après les touches de routage.
Bien que l'utilisation de commutateurs de connexion directe puisse améliorer notre système, il a toujours des limites et ne peut pas implémenter le routage des conditions multiples.
Dans notre système de messagerie, nous voulons souscrire non seulement à une file d'attente basée sur des clés de routage, mais aussi à une source basée sur des messages de production. Ces concepts proviennent de Unix Tool Syslog. Ce journal est basé sur des méthodes de routage strictes (info / warn / crit ...) et faciles (auth / cron / kern ...). Notre exemple est plus simple que celui-ci.
Cet exemple nous donnera beaucoup de flexibilité, par exemple, nous voulons écouter les journaux d'erreur «cron» et tous les journaux de «Kern».
Pour réaliser cette flexibilité, nous devons en savoir plus sur les commutateurs de sujet.
Interrupteur de thème
Lorsque vous utilisez un commutateur de sujet, vous ne pouvez pas utiliser les clés de routage arbitraires. Le format de la clé de routage doit être des mots divisés par des points. Tout mot que vous utilisez peut généralement exprimer le sens. Par exemple "Stock.usd.nyse", "nyse.vmw", "Quick.orange.rabbit". Mais la taille du mot est limitée à un maximum de 255 octets.
Utilisez le commutateur de thème pour définir les clés de routage pour faire attention à 2 points
Définir les clés de routage qui correspondent au commutateur du sujet
Dans cet exemple, nous enverrons tous les messages décrivant l'animal. Ce message sera envoyé avec une clé de routage composée de 3 mots et 2 points. Le premier mot consiste à exprimer la vitesse, la seconde décrit la couleur, et le troisième décrit le type: "<Speed>. <Omlowing>. <Speppey>".
Créez trois types de liaisons, Q1 et la clé "* .orange. *" Binding, Q2 et "*. *. Rabbit" et "Lazy. #" Binding.
Un aperçu des trois relations contraignants est:
Un message avec la clé de routage définie sur "Quick.orange.rabbit" sera transmis aux files d'attente Q1 et Q2. Il en va de même pour "lazy.orange.ephant" aussi. "Quick.orange.fox" ira à la première file d'attente, "lazy.brown.fox" ira dans la deuxième file d'attente, et "Lazy.pink.rabbit" ira dans la deuxième file d'attente dans le temps. Il correspond à 2 liaisons. "Quick.brown.fox" sera rejeté en raison d'un décalage.
Alors qu'en est-il de "orange" et "Quick.orange.male.rabbit"? Parce qu'aucune liaison n'est appariée, elle sera rejetée.
Qu'en est-il des clés de routage de "lazy.orange.male.rabbit"? , puisque paresseux. # correspond à la deuxième file d'attente.
Conseils pour les échangeurs de thème
Le commutateur de thème est génial et agit similaire à d'autres commutateurs.
Exemple de code
Le code n'est pas différent du code de routage précédent, veuillez voir
Config.java
package com.zb.rabbitmqtest.t5topics.config; import org.springframework.amqp.core. *; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; / ** * @Autor Zhang Bo * / @ @ configuration = "t5config") Config {/ ** * créé par: zhang bo * time: 2018/3/5 10:45 am * @apinote define topic échange * / @bean public topicexchange topicexchange () {return new topicexchange ("topic-expchange"); } / ** * Créateur: Zhang Bo * Temps: 2018/3/5 10:48 AM * @APinote Définition pour supprimer automatiquement la file d'attente anonyme * / @Bean Public Queue Autodeleteeue0 () {return new anonymousqueue (); } / ** * Créateur: Zhang Bo * Temps: 2018/3/5 10:48 AM * @APinote Définition pour supprimer automatiquement la file d'attente anonyme * / @Bean Public Queue Autodeleteeue1 () {return new anonymousqueue (); } / ** * Créé par: Zhang Bo * Heure: 2018/3/5 10:48 AM * @Param TopiceXchange Switch * @param autoDeletequeue0 Supprimer automatiquement la file d'attente * @Apinote Binding Utilisez la touche de routage Orange à la file {return bindingBuilder.bind (autodeleteeue0) .to (topicexchange) .with ("*. Orange. *"); } /** * Created by: Zhang Bo* Time: 2018/3/5 10:48 am * @param topicExchange Theme Switch* @param autoDeleteQueue1 Automatically delete the queue* @apiNote Binding using the autoDeleteQueue1 with the routing key black to the topic switch* @return Binding */ @Bean public Binding binding1a(TopicExchange topicExchange, Queue autodeleteeue1) {return bindingBuilder.bind (autodeleteeue1) .to (topicexchange) .with ("*. *. Rabbit"); } / ** * Créé par: Zhang Bo * Heure: 2018/3/5 10:48 AM * @Param TopicexChange Switch * @param Autodeletequeue1 Supprimer automatiquement la file d'attente * @Apinote Binding Utilisez la touche de routage verte à la file d'attente à l'interrupteur de thème * @return Binding * / @Bean public Binding1b) return bindingBuilder.bind (autodeleteeue1) .to (topicexchange) .with ("paresseux. #"); }} Récepteur.java
package com.zb.rabbitmqtest.t5topics.receiver; import org.springframework.amqp.rabbit.annotation.rabbitListener; import org.springframework.Stereotype.Component; / ** * @author zhang bo * / @ component (value = "t5receiver") "# {autodeleteeue0.name}") public void receiver0 (string str) {System.out.println ("receiver0 ++++++++++:" + str); // essayez {// thread.sleep (1000); //} catch (InterruptedException e) {// e.printStackTrace (); //}} @rabbitListener (que les queues = "# {autodeleteeue1.name}") public void receiver1 (string str) {System.out.println ("receiver1 ++++++++++:" + str); // essayez {// 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.rabbittemlate; import org.springframework.beans.factory.annotation.autowired; import; org.springframework.sterreoType.component; / ** * @author zhang bo * / @ composant (value = "t5Send") public class envoy {@autowired private topicexchange topicexchange; @Autowired Private RabbitTemplate RabbitTemplate; String privé [] keys = {"Quick.orange.rabbit", "lazy.orange.ephant", "Quick.orange.fox", "lazy.brown.fox", "lazy.pink.rabbit", "Quick.brown.fox"}; public void Send () {String Message = "hahaha"; pour (int i = 0; i <5; i ++) {System.out.println ("Send +++++++++++++:". Concat (message)); RabbitTemplate.ConvertandSend (topicexchange.getName (), Keys [5], message); }}} 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; org.springframework.test.context.junit4.springrunner; / ** * @author zhang bo * / @ runwith(springrunner.class)@springboottestpublic class SendTest {@autowired private Send; @Test public void Send () lève une exception {Send.Send (); }}Je ne quitterai pas les résultats du test, veuillez le vérifier vous-même.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.