1. Prefacio
Hay 2 conceptos importantes en el middleware de mensajes: corredor de mensajes y destino. Cuando el remitente del mensaje envía el mensaje, el corredor de mensajes toma el mensaje, que asegura que el mensaje se entregue al destino especificado.
Nuestros corredores de mensajes de uso común incluyen las especificaciones JMS y AMQP. En consecuencia, sus implementaciones comunes son ActivemQ y RabbitMQ.
2. Integrar ActivemQ
2.1 Agregar dependencias
<Spendency> <ProupId> org.springframework.boot </groupid> <artifactid> spring-boot-starter-activemq </artifactid> </peperspency> <! </pendency>
2.2 Agregar configuración
# Activemq Configurar Spring.Activemq.Broker-Url = tcp: //192.168.2.12: 61616spring.activemq.user = adminspring.activemq.password = adminspring.activemq.pool.enSenged = falsespring.activq.pool.max-connections La configuración debe establecerse en truespring.jms.pub-subdomain = false
Aquí spring.activemq.pool.enabled = falso significa cerrar el grupo de conexión.
2.3 codificación
Clase de configuración:
@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 crear colas y temas.
Productor de mensajes:
@ComponentPublic Class JMSSSender {@aUtowired private Queue Queue; @Autowired Topic Topic Tema; @Autowired JMSMessMessagingTemplate JMSTEMPLATE; public void sendByQueue (mensaje de cadena) {this.jmstemplate.convertandSend (queue, mensaje); } public void sendBytopic (mensaje de cadena) {this.jmstemplate.convertandSend (tema, mensaje); }}Consumidor de mensajes:
@ComponentPublic Class JMSReceiver {@jmsListener (destino = jmsconfirguration.queue_name) public void recibeByQueue (string Message) {System.out.println ("Recibir mensaje de cola:" + mensaje); } @Jmslistener (destino = jmsconfirguration.topic_name) public void recibeByTopic (mensaje de cadena) {system.out.println ("Recibir mensaje de tema:" + mensaje); }}Los consumidores de mensajes escuchan mensajes usando la anotación @JMSListener.
2.4 Prueba
@Runwith (SpringRunner.class) @SpringBoottestPublic Class JMStest {@autewired private JMSSender remitente; @Test public void testSendByQueue () {for (int i = 1; i <6; i ++) {this.sender.sendbyqueue ("Hello Activemq Queue"+i); }} @Test public void testSendByTopic () {for (int i = 1; i <6; i ++) {this.sender.sendbytopic ("Hello Activemq Topic"+i); }}}Resultado de impresión:
Recibir mensaje de cola: Hello Activemq Queue 1
Recibir mensaje de cola: Hello Activemq Queue 2
Recibir mensaje de cola: Hello Activemq Queue 3
Recibir mensaje de cola: Hello Activemq Queue 4
Recibir mensajes de cola: Hello Activemq Queue 5
Establecer spring.jms.pub-sub-domain = true al probar el modo de publicación/suscripción
Recibir Mensaje del tema: Hola Activemq Tema 1
Recibir Mensaje del tema: Hola Tema 2 de Activemq
Recibir mensajes temáticos: Hola Tema 3
Recibir mensajes temáticos: hola activemq tema 4
Recibir mensajes temáticos: Hola Activemq Tema 5
3. Integrar RabbitMQ
3.1 Agregar dependencias
<Spendency> <MoupRupid> org.springframework.boot </groupid> <artifactID> spring-boot-starter-amqp </artifactid> </pendency>
3.2 Agregar configuración
spring.rabbitmq.host = 192.168.2.30spring.rabbitmq.port = 5672spring.rabbitmq.username = lucespring.rabbitmq.password = lucespring.rabbitmq.virtual =/test
3.3 Codificación
Clase de configuración:
@ConfigurationPublic Class AmqpConfirGuration {// =================================================== Public Static Final String Simple_queue = "Simple_queue"; @Bean Public Queue Queue () {return new Queue (simple_queue, true); } // ================= Public static final String ps_queue_1 = "ps_queue_1"; cadena final estática pública 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 cole 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 (FANDEOTEXCHIVE ()); } @Bean public Binding FanOutBinding2 () {return bindingBuilder.bind (psqueue2 ()). A (fanoUxChange ()); } // ========================= 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 RutingQueue1 () {return new Queue (enrutamiento_queue_1, true); } @Bean public cole rutingqueue2 () {return new Queue (Routing_queue_2, true); } @Bean public DirectExchange DirectExchange () {return New DirectExchange (direct_exchange); } @Bean public Binding DirectBinding1 () {return BindingBuilder.Bind (RoutingQueue1 ()). A (DirectExchange ()). Con ("Usuario"); } @Bean public Binding DirectBinding2 () {return BindingBuilder.Bind (RoutingQueue2 ()). TO (DirectExchange ()). Con ("Orden"); } // ============. public static final String topic_queue_2 = "topic_queue_2"; public static final String topic_exchange = "topic_exchange"; @Bean Public Queue Topicqueue1 () {return new Queue (topic_queue_1, true); } @Bean public cole topicqueue2 () {return new Queue (topic_queue_2, true); } @Bean public topicExchange topiceXchange () {return new topiceXchange (topic_exchange); } @Bean public Binding topicBinding1 () {return bindingBuilder.bind (topicqueue1 ()). A (topiceXchange ()). Con ("user.add"); } @Bean public Binding topicBinding2 () {return bindingBuilder.bind (topicqueue2 ()). A (topiceXchange ()). Con ("usuario.#"); }}RabbitMQ tiene múltiples modos de trabajo, por lo que hay muchas configuraciones. Los lectores que desean conocer el contenido relevante pueden consultar "Introducción al modo de trabajo de RabbitMQ" o información relacionada con Baidu por su cuenta.
Productor de mensajes:
@ComponentPublic Class amqpsender {@aUtowired private amqptEmplate amqptEmplate; / ** * Modo simple Enviar * * @param Mensaje */ public void SimpleSend (mensaje de cadena) {this.amqptemplate.convertandsend (amqpconfirguration.simple_queue, mensaje); }/** * publicar/suscripción en modo enviar * * @param mensaje */public void pssend (mensaje de cadena) {this.amqptemplate.convertandsend (amqpconfirGuration.fanout_exchange, "", mensaje); } / ** * Enviar en el modo de enrutamiento * * @param Mensaje * / public void Rutingsend (String RoutingKey, String Mensaje) {this.amqptemplate.convertandSend (amqpconfirguration.direct_exchange, enrutamiento Key, mensaje); } / ** * Enviar en el modo de tema * * @param RoutingKey * @param Mensaje * / public void Topicsend (String RoutingKey, String Message) {this.amqptemplate.convertandsend (amqpconfirguration.topic_exchange, rutingkey, mensaje); }}Consumidor de mensajes:
@ComponentPublic Class amqpreceiver { / ** * Recepción de modo simple * * @param Mensaje * / @rabbitListener (queues = amqpconfirguration.simple_queue) public void simplereive (string Message) {System.out.println ("Recibir mensaje:" + Mensaje); }/** * recepción del modo publicar/suscripción * * @param mensaje */@rabbitListener (queues = amqpconfirguration.ps_queue_1) public void psreCeive1 (string mensaje) {system.out.println (amqpconfirgurtion.ps_queue_1 + "recibir mensaje:" + mensaje); } @RabitListener (queues = amqpconfirguration.ps_queue_2) public void psreceive2 (string mensaje) {system.out.println (amqpconfirguration.ps_queue_2 + "recibir mensaje:" + mensaje); } / ** * Recepción del modo de enrutamiento * * @Param Mensaje * / @rabbitListener (queues = amqpconfirGuration.Routing_queue_1) public void RoutingReceive1 (string Message) {System.out.println (AMQPConfirgurtion.Routing_queue_1 + "Recibir mensaje:" + Mensaje); } @RabBitListener (queues = amqpconfirguration.routing_queue_2) public void RoutingReceive2 (string Mensaje) {System.out.println (AMQPConfirGuration.Routing_queue_2 + "Recibir mensaje:" + Mensaje); } / ** * Recepción del modo de tema * * @param Mensaje * / @rabbitListener (queues = amqpconfirGuration.topic_queue_1) public void topicReceive1 (string Message) {System.out.println (amqpconfirguting.topic_queue_1 + "Recibir mensaje:" + mensaje); } @RabbitListener (queues = amqpconfirguration.topic_queue_2) public void topicReceive2 (string Message) {System.out.println (amqpconfirguration.topic_queue_2 + "Recibir mensaje:" + mensaje); }}Los consumidores de mensajes escuchan mensajes usando @RabBitListener Annotation.
3.4 Prueba
@Runwith (springrunner.class) @springboottestpublic class amqptest {@aUtowired private amqpsender remitente; @Test public void testSimplePleSend () {for (int i = 1; i <6; i ++) {this.sender.simplePleSend ("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 testRoutingSend () {for (int i = 1; i <6; i ++) {this.sender.routingsend ("orden", "test rutingsend"+i); }} @Test public void testTopicsend () {for (int i = 1; i <6; i ++) {this.sender.topicsend ("user.add", "Test topicsend"+i); }}}Los resultados de la prueba se omiten. . .
Recordatorio 1: Access_Refused El inicio de sesión se rechazó utilizando el mecanismo de autenticación simple
Solución:
1) Asegúrese de que el nombre de usuario y la contraseña sean correctos. Es importante tener en cuenta si los valores del nombre de usuario y la contraseña contienen espacios o pestañas (el autor lo probó porque la contraseña tenía un carácter de pestaña más, que causó el fracaso de la autenticación).
2) Si la cuenta de prueba está utilizando Guest, debe modificar el archivo RabbitMQ.Conf. Agregue la configuración "Loopback_users = None" al archivo.
No se puede preparar la cola para el oyente. O la cola no existe o el corredor no nos permitirá usarla
Solución:
Podemos iniciar sesión en la interfaz de gestión de RabbitMQ y agregar manualmente la cola correspondiente en la opción de cola.
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.