Introducción al conejo
RabbitMQ es un sistema de mensajería empresarial completo y reutilizable basado en AMQP
MQ es el nombre completo de la cola de mensajes. Message Queue (MQ) es un método de comunicación entre aplicaciones y aplicaciones. Las aplicaciones se comunican leyendo y escribiendo mensajes en cola (datos para aplicaciones) sin una conexión dedicada para vincularlos. La entrega de mensajes se refiere a la comunicación entre programas enviando datos en mensajes, en lugar de llamarse directamente entre sí, las llamadas directas generalmente se usan en técnicas como llamadas de procedimientos remotos. La cola se refiere a la solicitud que se comunica a través de una cola. El uso de colas elimina el requisito de que tanto la aplicación de recepción como el envío se ejecuten simultáneamente.
AMQP es un protocolo, un protocolo de comunicación de mensajes de capa de abstracción de alto nivel.
Aunque existen muchos estándares públicos en el mundo de la mensajería sincrónica (como Cobar IIOP, o SOAP, etc.), este no es el caso en el procesamiento de mensajes asincrónicos. Solo las grandes empresas tienen algunas implementaciones comerciales (como MSMQ de Microsoft, WebSphere MQ, etc.) de Microsoft, etc.). Por lo tanto, en junio de 2006, Cisco, Redhat, Imatix y otros formularon conjuntamente los estándares públicos para AMQP. En otras palabras, AMQP es un protocolo para la comunicación asincrónica.
Escenarios de uso de RabbitMQ
En el proyecto, algunas operaciones que requieren mucho tiempo que no requieren retorno inmediato se extraen y procesan asincrónicamente. Este procesamiento asincrónico ahorra en gran medida el tiempo de respuesta de solicitud del servidor, mejorando así el rendimiento del sistema. Sin embargo, la mayoría de ellos no solo no están obligados a regresar al instante, y no importa si la ejecución es exitosa o no. Si necesita devolución instantánea, puede usar Dubbo. Spring Boot se integra con Dubbo, puede ver la integración de arranque de Spring Dubbox
Dependencia de conejos
RabbitMQ no es un paquete JAR simple (el paquete JAR solo proporciona algunas funciones de comunicación básicas con RabbitMQ). Similar a Dubbo, RabbitMQ también requiere otro software para ejecutar. El siguiente es el software requerido para que RabbitMQ se ejecute.
1. Erlang
Dado que el software RabbitMQ en sí se desarrolla en base a Erlang, si desea ejecutar RabbitMQ, primero debe seguir a Erlang
Sitio web oficial de Erlang
Dirección de descarga de Erlang
Conejo
RabbitMQ es el núcleo de la implementación de colas de mensajes
Sitio web oficial de RabbitMQ
Descarga de rabbitmq
Configuración de RabbitMQ
Después de completar la instalación, debe completar alguna configuración antes de usar RabbitMQ. Puede usar directamente CMD en el directorio SBIN en el directorio de instalación de RabbitMQ a través de la configuración del comando, o puede encontrar directamente el símbolo del sistema RabbitMQ (SBIN DIR) en el menú Inicio para ejecutar SBIN directamente al directorio de instalación de RabbitMQ. Por conveniencia, primero habilitamos el complemento de administración y ejecutamos los comandos.
rabbitmq-plugins.bat habilitar rabbitmq_management
Así es, tenga en cuenta que esto está debajo de las ventanas. Si es Linux, no hay sufijo de murciélago. Luego agregamos un usuario, porque la conexión no puede tener éxito sin usuarios en el entorno de red externo. Ejecutar el comando Agregar usuario
Rabbitmqctl.bat add_user springboot contraseña
SpringBoot es el nombre de usuario y la contraseña es la contraseña
Luego, para la comodidad de la demostración, le damos a los permisos del administrador para facilitar el inicio de sesión en la página de gestión
rabbitmqctl.bat set_user_tags springboot administrador
Dar permisos de cuenta
rabbitmqctl.bat set_permissions -p / springboot.*.*.*
Luego inicie el servicio RabbitMQ y visite la página de gestión de RabbitMQ http: // localhost: 15672 para ver la página de inicio de sesión. Si no se crea el usuario, puede usar el invitado y el invitado para iniciar sesión. Si hay un usuario creado, use el usuario creado para iniciar sesión. Si hay un usuario creado, use el usuario creado para iniciar sesión.
Crear proyecto Springboot
Como ya mencioné crear un proyecto de arranque de primavera en el artículo anterior muchas veces, no diré mucho aquí
Agregar dependencias relacionadas con RabbitMQ
<
Así es, solo una pequeña configuración, pero es posible que no entienda de esta manera, por lo que será mejor que publique todas las configuraciones.
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0. http://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelVersion> 4.0.0 </modelVersion> <MoupRupid> wang.raye.rabbitmq </groupId> <name> Demo1 </name> <URL> http://maven.apache.org </ url> <properties> <ject.build.sourceEncoding> utf-8 </project.build.sourceEncoding> </propiies> <-parent> <grupid> org.springframe.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <versever> 1.4.0.release </ververy> </parent> <pendencies> <pendency> <uproupid> junit </groupid> <artifactid> junit </artifactid> <versers> 3.8.1 </prover> <cope> test </cope> </pope> </pope> <! Dependency> <! SpringBoot-<Spendily> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- rabbitmq --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> </dependencias> </ject>
Debido a que no se realizan otras operaciones, el proyecto actualmente se basa principalmente en dos módulos, un arranque de ramificación y un conejo
Agregar clase de configuración
paquete wang.raye.rabbitmq.demo1; import org.springframework.amqp.core.acknowledgemode; importar org.springframework.amqp.core.binding; importar org.springframework.amqp.core.binding; importar org.springframework.amqp.core.bindingbuilder; importar org.springframework.amqp.core.directexchange; importar org.springframework.amqp.core.message; importar org.springframework.amqp.core.queue; importar org.springframework.amqp.rabbit.connection.cachingConnectionFactory; importar org.springframework.amqp.rabbit.connection.connectionFactory; importar org.springframework.amqp.rabbit.core.channelawaremessageListener; importar org.springframework.amqp.rabbit.listener.simplemessageListenerContainer; importar org.springframework.context.annotation.bean; importar org.springframework.context.annotation.configuration;/*** Rabbitmq Class de configuración* @author raye* @sCene el 12 de octubre de 2016 10:57:44*/ @Configuración de la clase pública RabbitMqConfig {/** Nombre del conmutador de mensajes*/Public Static Final Exchange = "My-MQ-EXCHANG"; / ** Key1 de cola*/ public static final String RoutingKey1 = "queue_one_key1"; / ** Key2*/ public static final String RoutingKey2 = "queue_one_key2"; / *** Información del enlace de configuración* @return*/ @bean public una conexiónFactory ConnectionFactory () {CachingConnectionFactory ConnectionFactory = new CachingConnectionFactory ("127.0.0.1", 5672); ConnectionFactory.SetUsername ("SpringBoot"); ConnectionFactory.setPassword ("Password"); ConnectionFactory.SetVirtualHost ("/"); ConnectionFactory.setPublisherConFirms (verdadero); // debe establecerse ConnectionFactory; } / *** Configurar el interruptor de mensaje* Configurar FanOutExchange para los consumidores: distribuya mensajes a todas las colas vinculadas, sin el concepto de enrutamiento de llave de llave, Cambio de encabezado: Match DirectExchange agregando atributo clave de atributo-Value: distribuir a la cola especificada según } / ** * Configurar la cola de mensajes 1 * Configurar para los consumidores * @return * / @bean public queue Queue () {return new Queue ("queue_one", true); // Cantidad persistente}/*** Bind Message Queue 1 con Switch* Configurar para los consumidores* @return*/@Bean Public Binding Binding () {return bindingBuilder.bind (queue ()). A (defaultExchange ()). Con (rabbitMqConfig.routingkey1); } / ** * Configurar la cola de mensajes 2 * Configurar para los consumidores * @return * / @Bean public queue Queue1 () {return new Queue ("Queue_one1", true); // Persistencia rápida}/*** Binde de mensajes de enlace 2 con el conmutador* Configurar para los consumidores* @return*/@Bean public Binding Binding1 () {return bindingBuilder.bind (queue1 ()). A (defaultExchange ()). Con (rabBitMqConfig.routingkey2); } / *** Acepte el mensaje de escucha, este oyente aceptará el mensaje de la cola de mensajes 1* Configurar para los consumidores* @return* / @bean public simpleMessageListenerContainer MessageContainer () {simplEmessageListenercontainer Container = new SimpleSessageListenerContainer (ConnectionFactory ()); contenedor.setqueues (queue ()); Container.SetExPosElistenerChannel (verdadero); Container.SetMaxConcurrentConsumers (1); contenedor.setConcurrentConsumers (1); Container.SetAcknowledgemode (reconocer elGemode.Manual); // Establecer el modo de confirmación confirmar manualmente Contener.setMessAgelistener (New ChannelAwaremessageListener () {public void onMessage (mensaje de mensaje, com.rabbitmq.client.channel canal) arroja excepción {byte [] body = message.getBody (); System.out.println ("Mensaje recibido:" + nuevo String (Body)); Channel.Basicack (Message.getMessageProperties (). GetDeliveryTag (), falso); contenedor de devolución; } / *** Acepte el mensaje de escucha, este oyente aceptará el mensaje de la cola de mensajes 1* Configuración para los consumidores* @return* / @Bean public simpleMessAsageListenerContainer MessageContainer2 () {simplEmessageListenerContainer Container = new SimpleSageListEnperContainer (ConnectionFactory ());););); contenedor.setqueues (queue1 ()); Container.SetExPosElistenerChannel (verdadero); Container.SetMaxConcurrentConsumers (1); contenedor.setConcurrentConsumers (1); Container.SetAcknowledgemode (reconocer elGemode.Manual); // Establezca el modo de confirmación confirmar manualmente contenedor.setMessageListener (New ChannelAwarEmessAgelistener () {public void onMessage (mensaje de mensaje, com.rabbitmq.client.channel canal) lanza excepción {byte [] body = message.getBody (); System.out.println ("Message de Thina1 Recibido:" + New String (Body); Channel.Basicack (Message.getMessageProperties (). GetDeliveryTag (), falso); contenedor de devolución; }}Tenga en cuenta que para demostrar mejor cómo configurar, configuré dos colas de mensajes. Excepto donde se configura la configuración del enlace, el resto de esta clase está dirigido a los consumidores de mensajes. Por supuesto, tanto los consumidores de mensajes como los productores de mensajes deben configurar la información del enlace. Por conveniencia, los consumidores y productores de mensajes de este proyecto están en este proyecto. En general, el proyecto real no estará en el mismo proyecto. Dado que los comentarios son muy detallados, no diré mucho.
Enviar un mensaje
Para facilitar el envío de mensajes, escribí directamente un controlador para llamar al método para enviar mensajes accediendo a la interfaz. Sin más preámbulos, agregue el código
paquete wang.raye.rabbitmq.demo1; import java.util.uuid; import org.springframework.amqp.rabbit.core.rabbittemplate; importar org.springframework.amqp.rabbit.support.CorrelationData; importar org.springframework.web.bind.annotation.requestMapping; importar org.springframework.web.bind.annotation.restController;/** * Pruebe el controlador de RabbitMQ para enviar mensajes * @Author Raye * */ @RestControllerPublic Class SendController implementa Rabbittemplate.ConfirmCallback {Rabbittemplate privado Rabbittemplate; /*** Configure el rabbittemplate para enviar mensajes. Debido a que es un constructor, el resorte se inyectará automáticamente sin anotación (debería ser una característica de la nueva versión) * @param rabbittemplate */ public sendController (rabbittemplate rabbittemplate) {this.rabbittemplate = rabbittemplate; // establecer la devolución de llamada de consumo this.rabbittemplate.setConfirmCallback (esto); } / ** * Enviar un mensaje a la cola de mensajes 1 * @param msg * @return * / @requestmapping ("send1") public string send1 (string msg) {string uuid = uuid.randomuuid (). ToString (); CorrelationData correspondencia = new CorrelationData (UUID); rabbittemplate.convertandsend (rabbitmqconfig.exchange, rabbitmqconfig.routingkey1, msg, correspondencia); regresar nulo; } / ** * Enviar un mensaje a la cola de mensajes 2 * @param msg * @return * / @requestmapping ("send2") public string send2 (string msg) {string uuid = uuid.randomuuid (). ToString (); CorrelationData CorrelationId = New CorrelationData (UUID); rabbittemplate.convertandsend (rabbitmqconfig.exchange, rabbitmqconfig.routingkey2, msg, correlationID); regresar nulo; } / *** Mensaje de devolución de llamada, implementando principalmente la interfaz rabbittemplate.confirmCallback* Tenga en cuenta que las devoluciones de llamada de mensajes solo pueden representar mensajes exitosos enviados al servidor RabbitMQ, y no pueden representar mensajes exitosos procesados y aceptados* / public void Confirmar (CorrelationData correspondiente, Boolean, String Cause) {System.out.Println ("Callback Id:" Correlation CorrespondenceATeATeATATATA). if (ack) {system.out.println ("consumo de mensajes fallido:" + causa + "/n Resen"); }}}Cabe señalar que las devoluciones de llamada de mensajes solo pueden representar el mensaje exitoso que se envía al servidor RabbitMQ.
Luego comenzamos el proyecto y visitamos http: // localhost: 8082/send1? Msg = aaaa y encontrará que la salida de la consola es
Mensaje recibido: AAAA
ID de devolución de llamada: CorrelationData [ID = 37E6E913-835A-4ECA-98D1-807325C5900F]
Consumo exitoso de noticias
Por supuesto, la identificación de devolución de llamada puede ser diferente. Si visitamos http: // localhost: 8082/send2? Msg = bbbb, la salida será
Mensaje recibido de cola1: BBBB
ID de devolución de llamada: CorrelationData [ID = 0CEC7500-3117-4AA2-9EA5-4790879812D4]
Consumo exitoso de noticias
Unas pocas palabras al final
Debido a que este artículo explica principalmente cómo integrar RabbitMQ de cero a Springboot, no hay explicación para mucha información y uso de RabbitMQ. Si no está familiarizado con RabbitMQ, puede consultar otros artículos sobre RabbitMQ y adjuntar la demostración de este artículo.
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.