1. Vorwort
Es gibt 2 wichtige Konzepte in Message Middleware: Message Broker und Ziel. Wenn der Nachrichtensender die Nachricht sendet, wird die Nachricht vom Message Broker übernommen, wodurch die Nachricht an das angegebene Ziel übermittelt wird.
Unsere häufig verwendeten Nachrichtenmakler enthalten JMS- und AMQP -Spezifikationen. Entsprechend sind ihre gemeinsamen Implementierungen Activemq und Rabbitmq.
2. Integrieren Sie Activemq
2.1 Abhängigkeiten hinzufügen
<Depepentcy> <gruppe> org.springFramework.boot </GroupId> <artifactId> Spring-Boot-Starter-Activemq </artifactID> </abhängig> <! </abhängig>
2.2 Konfiguration hinzufügen
# activemq configure spring.activemq.broker-url = tcp: //192.168.2.12: 61616spring.activemq.User = adminsspring. muss auf truespring.jms.pub-sub-domain = false eingestellt werden
Hier spring.activemq.pool.enabled = false bedeutet, den Verbindungspool zu schließen.
2.3 Codierung
Konfigurationsklasse:
@ConfigurationPublic Class JMSConfirguration {public static Final String queue_name = "activeMQ_queue"; public static Final String topic_name = "activeemq_topic"; @Bean public Queue queue () {neuer activeMQQUEUE (queue_name); } @Bean public Topic Topic () {Neue activeMQTopic zurückgeben (topic_name); }}Verantwortlich für die Erstellung von Warteschlangen und Themen.
Nachrichtenproduzent:
@ComponentPublic Class JMSSender {@autowired Private Queue Queue; @Autowired Private Thema; @Autowired Private JMSMessagingTemplate JMStemplate; public void sendByQueue (String -Nachricht) {this.jmStemplate.ConvertandSend (Queue, Nachricht); } public void sendBytopic (String -Nachricht) {this.jmStemplate.ConvertandSend (Thema, Nachricht); }}Nachrichtenverbraucher:
@ComponentPublic Class JMSReceiver {@jmsListener (destination = jmsconfirguration.queue_name) public void recemeByQueue (String -Nachricht) {System.out.println ("Empfangs -Queue -Nachricht empfehlen:" + meldung); } @JmsListener (destination = jmsConfirguration.topic_name) public void recemeBytopic (String -Nachricht) {System.out.println ("Empfangsnachricht empfangen:" + meldung); }}Nachricht Verbraucher hören Nachrichten mit @JMSListener Annotation an.
2.4 Test
@Runwith (springrunner.class) @springBoottestPublic -Klasse JMSTEST {@AUTOWRED Private JMSSender Sender; @Test public void testsendByQueue () {für (int i = 1; i <6; i ++) {this.sender.sendByQueue ("Hallo Activemq Queue"+i); }} @Test public void testsendBytopic () {für (int i = 1; i <6; i ++) {this.sender.sendBytopic ("Hallo Activemq -Thema"+i); }}}Druckergebnis:
Empfangen Sie Warteschlangennachricht: Hallo Activemq Queue 1
Empfangen Sie Warteschlangennachricht: Hallo Activemq Queue 2
Empfangen Sie Warteschlangennachricht: Hallo Activemq Queue 3
Empfangen Sie Warteschlangennachricht: Hallo Activemq Queue 4
Empfangen Sie Warteschlangenmeldungen: Hallo Activemq Queue 5
Setzen Sie spring.jms.pub-sub-domain = true Beim Testen des Veröffentlichung/Abonnement-Modus
Themennachricht erhalten: Hallo Activemq Thema 1
Themennachricht erhalten: Hallo Activemq Thema 2
Erhalten Sie Themenmeldungen: Hallo Activemq Thema 3
Erhalten Sie Themenmeldungen: Hallo Activemq Thema 4
Erhalten Sie Themenmeldungen: Hallo Activemq Thema 5
3.. Integrieren Sie Rabbitmq
3.1 Abhängigkeiten hinzufügen
<Depopenty> <gruppe> org.springFramework.boot </Groupid> <artifactId> Spring-Boot-Starter-Amqp </artifactid> </abhängig>
3.2 Konfiguration hinzufügen
Spring.Rabbitmq.host = 192.168.2.30Spring.Rabbitmq.port = 5672Spring.rabbitmq.Unername = Lightsspring.Rabbitmq.Password = Lightsspring.Rabbitmq.Virtual-Host =/test
3.3 Codierung
Konfigurationsklasse:
@Configurationpublic class AmqpConfirguration { //================================================= public static final String SIMPLE_QUEUE = "simple_queue"; @Bean public Queue queue () {neue Warteschlange zurückgeben (Simple_queue, true); } // ================ public static Final String ps_queue_1 = "ps_queue_1"; public static final String ps_queue_2 = "ps_queue_2"; public static final String fanout_exchange = "fanout_exchange"; @Bean public Queue PSQUEU1 () {Neue Warteschlange zurückgeben (ps_queue_1, true); } @Bean public Queue PSQUEU2 () {Neue Warteschlange zurückgeben (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 ()); } // ======================== public static Final String routing_queue_1 = "routing_queue_1"; public static final String routing_queue_2 = "routing_queue_2"; public static Final String Direct_Exchange = "Direct_Exchange"; @Bean public Queue Routingqueue1 () {Neue Queue zurückgeben (Routing_queue_1, true); } @Bean public Queue Routingqueue2 () {neue Queue zurückgeben (Routing_queue_2, true); } @Bean public DirectExchange DirectExchange () {return New DirectExchange (Direct_Exchange); } @Bean public binding directBinding1 () {return bindingBuilder.bind (Routingqueue1 ()). TO (DirectExchange ()). Mit ("Benutzer"); } @Bean public binding directBinding2 () {return bindingBuilder.bind (Routingqueue2 ()). TO (DirectExchange ()). Mit ("order"); } // ============= Themenmodus ==================== Public Static Final String topic_queue_1 = "topic_queue_1"; public static Final String topic_queue_2 = "topic_queue_2"; public static Final String topic_Exchange = "topic_exchange"; @Bean public Queue topicQueue1 () {neue Queue zurückgeben (topic_queue_1, true); } @Bean public Queue topicQueue2 () {neue Queue zurückgeben (topic_queue_2, true); } @Bean public topicexchange topicexchange () {return New topicexchange (topic_exchange); } @Bean public binding topicbinding1 () {return bindingBuilder.bind (topicQueue1 ()). To (topicexchange ()). Mit ("user.add"); } @Bean public binding topicbinding2 () {return bindingBuilder.bind (topicQueue2 ()). To (topicexchange ()). Mit ("Benutzer.#"); }}Rabbitmq verfügt über mehrere Arbeitsmodi, daher gibt es viele Konfigurationen. Leser, die über relevante Inhalte wissen möchten, können "Einführung in den Arbeitsmodus von Rabbitmq" oder die in den Baidu bezogenen Informationen selbst untersuchen.
Nachrichtenproduzent:
@ComponentPublic Class amqpsender {@autowired private amqptemplate amqptemplate; / ** * Einfacher Modus senden * * @param meldung */ public void simpleSend (String -Nachricht) {this.amqptemplate.convertandSend (amqpconfirguration.simple_queue, meldung); }/** * veröffentlichen/abonnieren Modus senden * * @param meldung */public void psSend (String -Nachricht) {this.amqptemplate.convertandSend (amqpconfirguration.fanout_Exchange, "", "", "", "", "", "", "", "", "", "", "", "", "meldung); } / ** * Routing -Modus senden * * @param meldung * / public void routingsend (String routingKey, String -Nachricht) {this.amqptemplate.convertandSend (amqpconfirguration.direct_exchange, RoutingKey, Nachricht); } / ** * im Themenmodus senden * * @param routingKey * @param meldung * / public void topicsend (String RoutingKey, String -Nachricht) {this.amqptemplate.convertandSend (amqpconfirguration.topic_exchange, RoutingKey, Nachricht); }}Nachrichtenverbraucher:
@ComponentPublic Class amqpreceiver { / ** * Einfacher Modusempfang * * @param meldung * / @rabbitiereer (queues = amqpconfirguration.simple_queue) public void void simimereceive (String -Nachricht) {system.println ("Empfangsmeldung empfangen:" + message: " + message); }/** * Veröffentlichen/Abonnement -Modus -Empfang * * @param meldung */@rabbitListener (queues = amqpconfirguration.ps_queue_1) public void psceive1 (String -Nachricht) {System.out.println (amqpconfirguration.ps_queue_1 + " +" + " +" meldung: " + meldung); } @RabbitListener (queues = amqpconfirguration.ps_queue_2) public void psReceive2 (String -Nachricht) {system.out.println (amqpconfirguration.ps_queue_2 + "Empfangsnachricht:" + meldung); } / ** * Routing -Modus -Empfang * * @param meldung * / @rabbitListener (queues = amqpconfirguration.routing_queue_1) public void routingReceive1 (String -Nachricht) {System.out.println (Amqpconfirguration.routing_queue_1 + "Empfangsnachricht:" + "Message:" + "Message); } @RabbitListener (queues = amqpConfirguration.routing_queue_2) public void routingReceive2 (String -Nachricht) {System.out.println (amqpConfirguration.routing_queue_2 + "Empfangsnachricht:" + Message); } / ** * Themenmodusempfang * * @param meldung * / @rabbitListener (queues = amqpconfirguration.topic_queue_1) public void topicreceive1 (String -Nachricht) {System.out.println (amqpconfirguration.topic_queue_1 + " +" + " +" meldung: " + meldung): } @RabbitListener (queues = amqpconfirguration.topic_queue_2) public void topicreceive2 (String -Nachricht) {System.out.println (amqpconfirguration.topic_queue_2 + "Empfangen Sie:" + message); }}Nachricht Verbraucher hören Nachrichten mit @rabbitListener Annotation an.
3.4 Test
@Runwith (springrunner.class) @springBoottestpublic class amqptest {@autowired private amqpsender sender; @Test public void testSimplesSend () {für (int i = 1; i <6; i ++) {this.sender.simplesend ("Test Simplesend"+i); }} @Test public void testpsSend () {für (int i = 1; i <6; i ++) {this.sender.pSsend ("Test psSend"+i); }} @Test public void testpsSend () {für (int i = 1; i <6; i ++) {this.sender.pSsend ("Test psSend"+i); }} @Test public void testRoutingsend () {für (int i = 1; i <6; i ++) {this.sender.routingsend ("order", "test routingsend"+i); }} @Test public void testTopicsend () {für (int i = 1; i <6; i ++) {this.sender.topicsend ("user.add", "test topicsend"+i); }}}Die Testergebnisse werden übersprungen. . .
Erinnerung 1: Access_Refused Login wurde unter Verwendung der Authentifizierungsmechanismus abgelehnt
Lösung:
1) Bitte stellen Sie sicher, dass der Benutzername und das Passwort korrekt sind. Es ist wichtig zu beachten, ob die Werte des Benutzernamens und des Kennworts Leerzeichen oder Registerkarten enthalten (der Autor hat es getestet, da das Kennwort einen weiteren Registerkartenzeichen enthielt, was den Authentifizierungsfehler verursachte).
2) Wenn das Testkonto Gast verwendet, müssen Sie die Datei rabbitmq.conf ändern. Fügen Sie der Datei die Konfiguration "Loopback_users = None" hinzu.
Ich kann die Warteschlange nicht auf den Hörer vorbereiten. Entweder existiert die Warteschlange nicht oder der Broker erlaubt uns nicht, sie zu verwenden
Lösung:
Wir können uns an der RabbitMQ -Verwaltungsschnittstelle anmelden und die entsprechende Warteschlange in der Warteschlangenoption manuell hinzufügen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.