1. Prefácio
Existem 2 conceitos importantes no middleware da mensagem: corretor de mensagens e destino. Quando o remetente da mensagem envia a mensagem, a mensagem é assumida pelo corretor da mensagem, o que garante que a mensagem seja entregue ao destino especificado.
Nossos corretores de mensagens comumente usados incluem especificações JMS e AMQP. Da mesma forma, suas implementações comuns são ActiveMQ e RabbitMQ.
2. Integrar o ActiveMq
2.1 Adicione dependências
<Depencency> <GroupID> org.springframework.boot </frugiD> <stifactId> primavera-boot-starter-activemq </artifactId> </dependency> <!-se você precisar configurar o pool de conexão, adicione as seguintes dependências-> <Pepency> <proupid> org.apache.ActemQ <rugneTF <Grupoft. </dependency>
2.2 Adicione a configuração
# activemq Configure spring.activemq.broker-url=tcp://192.168.2.12:61616spring.activemq.user=adminspring.activemq.password=adminspring.activemq.pool.enabled=falsespring.activemq.pool.max-connections=50# When using publish/subscribe mode, the following A configuração precisa ser definida como truespring.jms.pub-sub-domain = false
Aqui spring.activeMq.pool.enabled = false significa fechar o pool de conexões.
2.3 Codificação
Classe de configuração:
@ConfigurationPublic Classe jmsconfirGuration {public static final string queue_name = "ActiveMq_queue"; public static final string tópico_name = "ActiveMq_topic"; @Bean Public Queue Queue () {return New ActiveMQQueue (Queue_name); } @Bean public tópico tópico () {return novo ActiveMqtopic (tópico_name); }}Responsável por criar filas e tópicos.
Produtor de mensagens:
@ComponentPublic Classe jmSsender {@AUTOWIRED PRIVADO Fila da fila; @Autowired tópico privado tópico; @AUTOWIRED PRIVADO JMSMESSAGINGTEMPLATE JMSTEMPLATE; public void sendByQueue (mensagem de string) {this.jmstemplate.convertandSend (fila, mensagem); } public void sendBytopic (string message) {this.jmstemplate.convertandSend (tópico, mensagem); }}Consumidor de mensagens:
@ComPonentPublic Classe jmSreceiver {@jmsListener (Destination = jmsconfirGuration.queue_name) public void ReceberByQueue (string message) {System.out.println ("Receba mensagem da fila:" + mensagem); } @JmsListener (destino = jmsconfirguration.topic_name) public void ReceberBytopic (string message) {System.out.println ("Receba mensagem de tópico:" + mensagem); }}Os consumidores de mensagens ouvem mensagens usando a anotação @JMSListener.
2.4 Teste
@Runwith (springrunner.class) @springboottestPublic Classe jmstest {@AUTOWIRED PRIVADO JMSSSENDEN DESPENDER; @Test public void testSendByQueUe () {for (int i = 1; i <6; i ++) {this.sender.sendByQueue ("Hello ActiveMq fila"+i); }} @Test public void testSendBytopic () {for (int i = 1; i <6; i ++) {this.sender.sendBytopic ("hello ActiveMq tópico"+i); }}}Resultado de impressão:
Mensagem da fila de recebimento: Hello ActiveMq fila 1
Mensagem da fila de recebimento: Hello ActiveMq fila 2
Mensagem da fila de recebimento: Hello ActiveMq fila 3
Mensagem da fila de recebimento: Hello ActiveMq fila 4
Receba mensagens da fila: Hello ActiveMQ Fila 5
Definir spring.jms.pub-sub-domain = true ao testar o modo de publicação/assinatura
Receba mensagem de tópico: Hello ActiveMQ Tópico 1
Receba mensagem de tópico: Hello ActiveMQ Tópico 2
Receba mensagens de tópico: Hello ActiveMQ Tópico 3
Receba mensagens de tópico: Hello ActiveMQ Tópico 4
Receba mensagens de tópico: Hello ActiveMQ Tópico 5
3. Integre o RabbitMQ
3.1 Adicione dependências
<Depencency> <PuerpId> org.springframework.boot </frugiD> <ArtifactId> Spring-boot-starter-amqp </artifactId> </dependency>
3.2 Adicione a configuração
spring.rabbitmq.host = 192.168.2.30spring.rabbitmq.port = 5672spring.rabbitmq.username = luzes de luz.rabbitmq.password = luzes de luz
3.3 Codificação
Classe de configuração:
@ConfigurationPublic Classe AMQPCONFIRGURATION {// ================================================== Public Static Final String String_queue = "Simple_eue"; @Bean Public Queue Queue () {retorna nova fila (simples_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 fila psqueue1 () {return New fileue (ps_queue_1, true); } @Bean public fila psqueue2 () {return new fila (ps_queue_2, true); } @Bean public fanoutExchange fanoutExchange () {retorna novo fanoutExchange (fanout_exchange); } @Bean Public Binding fanOutBinding1 () {return bindingbuilder.bind (psqueue1 ()). Para (fanoutExchange ()); } @Bean Public Binding fanOutBinding2 () {return bindingbuilder.bind (psqueue2 ()). Para (fanoutExchange ()); } // ========================= Public Static Final String Routing_queue_1 = "ROTING_QUEUE_1"; public static final string roting_queue_2 = "rotering_queue_2"; public static final string Direct_exchange = "Direct_exchange"; @Bean Public Queue RoutingQueue1 () {Retorne nova fila (ROTING_QUEUE_1, TRUE); } @Bean Public fila RoutingQueue2 () {Retorne nova fila (ROTING_QUEUE_2, TRUE); } @Bean public DirectExChange DirectExChange () {return new DirectExChange (Direct_exChange); } @Bean Public Binding DirectBinding1 () {return bindingbuilder.bind (roteringQueue1 ()). Para (DirectExChange ()). Com ("Usuário"); } @Bean Public Linding DirectBinding2 () {return bindingbuilder.bind (roteingQueue2 ()). Para (DirectExChange ()). Com ("Order"); } // ============= Modo de tema ===================== Public Static Final String Topic_queue_1 = "Topic_queue_1"; public static final string tópico_queue_2 = "tópico_queue_2"; public static final string tópico_exchange = "tópico_exchange"; @Bean Public fila tópico TOPTQUEUE1 () {return New fila (tópico_queue_1, true); } @Bean Public fila tópico TOPTQUEUE2 () {return New fileue (tópico_queue_2, true); } @Bean public topicexchange topicexchange () {return new TopicexChange (tópico_exchange); } @Bean Public Binding TopicBinding1 () {return bindingbuilder.bind (tópica1 ()). Para (topicexchange ()). Com ("user.add"); } @Bean Public Binding TopicBinding2 () {return bindingbuilder.bind (tópicos }}O RabbitMQ possui vários modos de trabalho, portanto, existem muitas configurações. Os leitores que desejam saber sobre o conteúdo relevante podem conferir "Introdução ao modo de trabalho do RabbitMQ" ou informações relacionadas ao Baidu por conta própria.
Produtor de mensagens:
@ComPonentPublic Classe AMQPSENDE {@AUTOWIRED PRIVADO AMQPTEMPLATE AMQPTEMPLATE; / ** * Modo simples envia * * @param mensagem */ public void SimpleSEnd (string message) {this.amqptemplate.convertandSend (amqpconfirguration.simple_queue, mensagem); }/** * Publicar/assinar o modo Enviar * * @param mensagem */public void PSSEnd (string message) {this.amqptemplate.convertandSend (amqpconfirguration.fanout_exchange, "", mensagem); } / ** * Enviar no modo de roteamento * * @param mensagem * / public void roteningSend (string roteingKey, string message) {this.amqptemplate.convertandSend (amqpconfirguration.direct_exchange, roteingKey, mensagem); } / ** * Envie o modo tema * * @param rotelingKey * @param mensagem * / public void tupicsEnd (string roteningKey, string message) {this.amqptemplate.ConvertandSend (amqpconfirguration.topic_exchange, rotingKey, mensagem); }}Consumidor de mensagens:
@ComponentPublic Classe amqpreceiver { / ** * Recepção de modo simples * * @param mensagem * / @rabbitListener (fileues = amqpconfirguration.simple_queue) public void simples (string message) {System.out.println ("Receber:" +); }/** * Publicar/assinar o modo Recepção * * @param message */@rabbitListener (filas = amqpconfirguration.ps_queue_1) public void psreceive1 (string message) {System.out.println (amqpconfirgucure.ps_queue_1 + "Receber_ten.out.println (amqpconfirgucure.ps_queue_1 +" Recender_1 + "Recender:" Receber.Println (amqpconfirgucure.ps_queue_1 + "Receber: Recender:" Recender: "Recender:" AMQPConfirgucure.ps_queue_1 + "Receber:" Recender: "Recender:" AMQPConfirgucure.ps_queue_1 + "Receber:" Receber: "Recender:" AMQPConfirguration. } @RabbitListener (filas = amqpconfirguration.ps_queue_2) public void psreceive2 (string message) {System.out.println (amqpconfirguration.ps_queue_2 + "Receber mensagem:" + mensagem); } / ** * Recepção do modo de roteamento * * @param mensagem * / @rabbitListener (filas = amqpconfirguration.routing_queue_1) public void RoutingReceive1 (string message) {System.out.println (amigdconfirguration.routing_ue_ee_1 + "Recender:" } @RabbitListener (filas = amqpconfirguration.Routing_Queue_2) public void RoutingReCeive2 (string message) {System.out.println (amqpconfirguration.routing_queue_2 + "Receber mensagem:" + mensagem); } / ** * Recepção do modo de tópico * * @param mensagem * / @rabbitListener (filas = amqpconfirguration.topic_queue_1) public void tópicoReceive1 (string message) {System.out.println (amqpconfirguration.topic_queue_1 + "Receber"; } @RabbitListener (filas = amqpconfirguration.topic_queue_2) public void tópicoReceive2 (string message) {System.out.println (amqpconfirguration.topic_queue_2 + "Receber mensagem:" + mensagem); }}Os consumidores de mensagens ouvem mensagens usando a anotação @RabbitListener.
3.4 Teste
@Runwith (springrunner.class) @springboottestPublic Classe amqptest {@aUTowired Private AMQPSEND REVENDER; @Test public void testSimppleSl () {for (int i = 1; i <6; i ++) {this.sender.simpleSnd ("teste simpleSnd"+i); }} @Test public void testPSSEnd () {for (int i = 1; i <6; i ++) {this.sender.pssend ("teste pssend"+i); }} @Test public void testPSSEnd () {for (int i = 1; i <6; i ++) {this.sender.pssend ("teste pssend"+i); }} @Test public void testRoutingSend () {for (int i = 1; i <6; i ++) {this.sender.routingsEnd ("order", "teste rotingSend"+i); }} @Test public void testTopicsEnd () {for (int i = 1; i <6; i ++) {this.sender.topicsend ("user.add", "teste tupicsend"+i); }}}Os resultados do teste são ignorados. . .
Lembrete 1: Access_refused Login foi recusado usando o mecanismo de autenticação simples
Solução:
1) Verifique se o nome de usuário e a senha estão corretos. É importante observar se os valores do nome de usuário e da senha contêm espaços ou guias (o autor o testou porque a senha tinha mais um caractere de guia, que causou a falha de autenticação).
2) Se a conta de teste estiver usando o convidado, você precisará modificar o arquivo rabbitmq.conf. Adicione a configuração "loopback_users = nenhum" ao arquivo.
Não pode preparar a fila para o ouvinte. Ou a fila não existe ou o corretor não nos permitirá usá -la
Solução:
Podemos fazer login na interface de gerenciamento do RabbitMQ e adicionar manualmente a fila correspondente na opção de fila.
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.