1. Préface
Il y a 2 concepts importants dans Message Middleware: Message Broker et Destination. Lorsque l'expéditeur de message envoie le message, le message est pris en charge par le courtier de messages, qui garantit que le message est transmis à la destination spécifiée.
Nos courtiers de messages couramment utilisés incluent les spécifications JMS et AMQP. En conséquence, leurs implémentations communes sont ActiveMQ et RabbitMQ.
2. Intégrer ActiveMQ
2.1 Ajouter des dépendances
<dependency> <proupId> org.springframework.boot </proupId> <ArtifActid> printemp-boot-starter-activermq </retifactid> </dependency> <! - Si vous avez besoin de configurer le pool de connexion, ajoutez les dépendances suivantes -> <petendency> <proupId> org.apache.actisem </proupId> <ArtifActid> ActivEmq Pooll </ ArtiforMq </prouverId> </Dependance>
2.2 Ajouter une configuration
# activemq configure spring.activemq.broker-url = tcp: //192.168.2.12: 61616spring.activemq.user = adminpring.activemq.password = adminpring.activemq.pool.enable doit être défini sur truspring.jms.pub-sub-domain = false
Ici spring.activemq.pool.enabled = false signifie clôturer le pool de connexion.
2.3 codage
Classe de configuration:
@Configurationpublic class jmsconfirguration {public static final string queue_name = "activemq_queue"; public static final string topic_name = "activemq_topic"; @Bean Public Queue Queue () {return new activeMQQueue (queue_name); } @Bean public Topic Topic () {return new activeMQTopic (topic_name); }}Responsable de la création de files d'attente et de sujets.
Producteur de messages:
@ComponentPublic classe JMSSender {@Autowired Private Queue Use; @Autowired Topic privé Sujet; @Autowired private jmsMessagingTemplate JMSteMplate; public void SendByQueue (Message de chaîne) {this.jmstemplate.convertandSend (file d'attente, message); } public void SendByTopic (Message de chaîne) {this.jmstemplate.convertandSend (sujet, message); }}Courgeur de messages:
@ComponentPublic class jmsReceiver {@jmsListener (destination = jmsconfirguration.queue_name) public void receseByqueue (String Message) {System.out.println ("reçoit le message de file d'attente:" + message); } @JmsListener (destination = jmsconfirguration.topic_name) public void receseByTopic (string message) {System.out.println ("Recevoir le message du sujet:" + message); }}Les consommateurs de messages écoutent des messages à l'aide de l'annotation @jmsListener.
2.4 Test
@Runwith (springrunner.class) @springboottestpublic class jmstest {@autowired private jmssender Sender; @Test public void testSendByQueue () {for (int i = 1; i <6; i ++) {this.sender.sendByqueue ("Hello activeMq file d'attente" + i); }} @Test public void testSendByTopic () {for (int i = 1; i <6; i ++) {this.sender.sendByTopic ("Hello activeMq Topic" + i); }}}Résultat d'impression:
Recevoir le message de la file d'attente: bonjour la file d'attente activeMQ 1
Recevoir le message de la file d'attente: bonjour la file d'attente activeMQ 2
Recevoir le message de la file d'attente: bonjour la file d'attente activeMQ 3
Recevoir le message de la file d'attente: bonjour la file d'attente activeMQ 4
Recevoir des messages de file d'attente: bonjour la file d'attente activeMQ 5
Set Spring.jms.pub-sub-domain = true lors des tests de test / sous-être en mode
Recevoir le message du sujet: bonjour activeMQ Sujet 1
Recevoir le message du sujet: Bonjour activeMQ Sujet 2
Recevoir les messages du sujet: Bonjour activeMQ Sujet 3
Recevoir les messages du sujet: bonjour activeMQ Sujet 4
Recevoir les messages du sujet: Bonjour activeMq Sujet 5
3. Intégrer le lapin
3.1 Ajouter des dépendances
<dependency> <proupId> org.springframework.boot </rombasid> <ArtifactId> printemp-boot-starter-amqp </etefactId> </Dependency>
3.2 Ajouter une configuration
printemps.rabbitmq.host = 192.168.2.30spring.rabbitmq.port = 5672Spring.rabbitmq.Username = Lightpring.rabbitmq.password = Lightpring.rabbitmq.Virtual-host = / test
3.3 Codage
Classe de configuration:
@Configurationpublic class AmqpConfirguration { //================================================= public static final String SIMPLE_QUEUE = "simple_queue"; @Bean Public Queue Queue () {return new Queue (Simple_queue, true); } // ================= chaîne finale statique publique PS_queue_1 = "PS_queue_1"; chaîne finale statique publique ps_queue_2 = "ps_queue_2"; Public Static Final String fanout_exchange = "fanout_exchange"; @Bean Public Queue PSQueue1 () {return new Queue (ps_queue_1, true); } @Bean Public Queue PSQueue2 () {return new Queue (ps_queue_2, true); } @Bean public fanoutexchange fanoutexchange () {return new Fanoutexchange (fanout_exchange); } @Bean Public Binding FanOutBinding1 () {return bindingBuilder.bind (psqueue1 ()). To (fanoutexchange ()); } @Bean Public Binding FanOutBinding2 () {return bindingBuilder.bind (psqueue2 ()). To (fanoutexchange ()); } // ======================. String final statique publique routing_queue_2 = "routing_queue_2"; public static final String Direct_Exchange = "Direct_Exchange"; @Bean public file d'attente RoutingQueue1 () {return new Queue (routing_queue_1, true); } @Bean Public Queue RoutingQueue2 () {return new Queue (routing_queue_2, true); } @Bean public DirectExChange DirectExchange () {return new Direxchange (Direct_Exchange); } @Bean Public Binding DirectBinding1 () {return bindingBuilder.bind (routingQueue1 ()). To (DirectExchange ()). Avec ("user"); } @Bean Public Binding DirectBinding2 () {return bindingBuilder.bind (routingQueue2 ()). To (DirectExchange ()). Avec ("Order"); } // ============== MODE DE THEME ==================== STATIQUE STATIQUE PUBLIQUE STRATION STATIQUE STRATION THère_queue_1 = "Topic_queue_1"; String final statique public topic_queue_2 = "topic_queue_2"; public static final String topic_exchange = "topic_exchange"; @Bean Public Queue TopicEue1 () {return new Queue (topic_queue_1, true); } @Bean Public Queue TopicEue2 () {return new Queue (topic_queue_2, true); } @Bean public topicexchange topicexchange () {return new topicexchange (topic_exchange); } @Bean Public Binding topicBinding1 () {return bindingBuilder.bind (topicQueue1 ()). To (topiceXchange ()). Avec ("user.add"); } @Bean Public Binding topicBinding2 () {return bindingBuilder.bind (topicQueue2 ()). To (topIcexchange ()). Avec ("user. #"); }}Rabbitmq a plusieurs modes de travail, il existe donc de nombreuses configurations. Les lecteurs qui souhaitent connaître le contenu pertinent peuvent consulter "Introduction au mode de travail RabbitMQ" ou les informations liées à Baidu par elles-mêmes.
Producteur de messages:
@Componentpublic classe AMQPSENDER {@autowired privé amqptemplate amqptemplate; / ** * Mode simple Envoyer * * @param Message * / public void SimpleSend (Message de chaîne) {this.amqptemplate.convertandSend (amqpconfirguration.simple_queue, message); } / ** * Mode Publish / Abonnez-vous Envoyer * * @param Message * / public void psSend (Message de chaîne) {this.amqptemplate.convertandSend (amqpconfirguration.fanout_exchange, "", message); } / ** * Envoyer en mode de routage * * @param message * / public void RoutingSend (String RoutingKey, Message de chaîne) {this.amqptemplate.convertandSend (amqpconfirguration.direct_exchange, routingKey, message); } / ** * Envoyer en mode thème * * @param routingKey * @param message * / public void TopicSend (String RoutingKey, String Message) {this.amqptemplate.convertandSend (AmqpConfirguration.topic_exchange, routingKey, message); }}Courgeur de messages:
@ComponentPublic classe AMQPreceiver {/ ** * Réception en mode simple * * Message @param * / @rabbitListener (quelles = amqpconfirguration.simple_queue) public void SimpleRECEive (message de chaîne) {system.out.println ("reçoit le message:" + message); } / ** * Publish / Abonnez-vous réception du mode * * @param message * / @rabbitListener (files d'attente = amqpconfirguration.ps_queue_1) public void psReceive1 (String Message) {System.out.println (AMQPConFirguration.ps_queue_1 + "Recevoir le message:" + message); } @RabbitListener (files d'attente = amqpconfirguration.ps_queue_2) public void psreceive2 (message de chaîne) {system.out.println (amqpconfirguration.ps_queue_2 + "message de réception:" + message); } / ** * Réception du mode de routage * * @param message * / @rabbitListener (files d'attente = amqpconfirguration.routing_queue_1) public void RoutingReceive1 (String Message) {System.out.println (AMQPConFirguration.Routing_queue_1 + "Recevoir Message:" + Message); } @RabbitListener (files d'attente = amqpconfirguration.routing_queue_2) public void RoutingReceive2 (message de chaîne) {System.out.println (AmqpConfirguration.routing_queue_2 + "Recevoir le message:" + message); } / ** * Réception du mode de rubrique * * @param message * / @rabbitListener (files d'attente = amqpconfirguration.topic_queue_1) public void topicReceive1 (String Message) {System.out.println (AMQPConFirguration.topic_queue_1 + "Recevoir le message:" + message); } @RabbitListener (files d'attente = amqpconfirguration.topic_queue_2) public void topicReceive2 (String Message) {System.out.println (AmqpConfirguration.topic_queue_2 + "Recevoir le message:" + message); }}Les consommateurs de messages écoutent des messages à l'aide de l'annotation @rabbitListener.
3.4 Test
@Runwith (springrunner.class) @springboottestpublic classe AMQPTEST {@autowired private AmqpSender Sender; @Test public void testImpleSend () {for (int i = 1; i <6; i ++) {this.sender.simplesend ("test Simplesend" + i); }} @Test public void testPSsend () {for (int i = 1; i <6; i ++) {this.sender.pssend ("test pssend" + i); }} @Test public void testPSsend () {for (int i = 1; i <6; i ++) {this.sender.pssend ("test pssend" + i); }} @Test public void TestRoutingSnd () {for (int i = 1; i <6; i ++) {this.sender.routingSend ("Order", "Test RoutingSend" + i); }} @Test public void testTopicSend () {for (int i = 1; i <6; i ++) {this.sender.topicsend ("user.add", "test topicsend" + i); }}}Les résultats des tests sont ignorés. . .
Rappel 1: Access_refused Login a été refusé en utilisant la plaine du mécanisme d'authentification
Solution:
1) Veuillez vous assurer que le nom d'utilisateur et le mot de passe sont corrects. Il est important de noter si les valeurs du nom d'utilisateur et du mot de passe contiennent des espaces ou des onglets (l'auteur l'a testé car le mot de passe avait un autre caractère d'onglet, ce qui a provoqué l'échec de l'authentification).
2) Si le compte de test utilise l'invité, vous devez modifier le fichier Rabbitmq.conf. Ajoutez la configuration "LOOPBACK_USERS = NONE" dans le fichier.
Impossible de préparer la file d'attente pour l'auditeur. Soit la file d'attente n'existe pas, soit le courtier ne nous permettra pas de l'utiliser
Solution:
Nous pouvons nous connecter à l'interface de gestion RabbitMQ et ajouter manuellement la file d'attente correspondante dans l'option de file d'attente.
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.