[RabbitMQ] SpringBoot integra RabbitMQ

Construir el entorno inicial

Introducir dependencias

<!--引入与rabbitmq集成依赖-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

También podemos verificar este lugar directamente al construir rápidamente;
inserte la descripción de la imagen aquí

perfil de configuración

spring:
  application:
    name: springboot_rabbitmq
  rabbitmq:
    host: 10.15.0.9
    port: 5672
    username: ems
    password: 123
    virtual-host: /ems

Este nombre no tiene significado práctico, pero es muy importante en proyectos de microservicios.La
configuración en rabbitmq es para conectarse con nuestro servicio RabbitMQ.

RabbitTemplateSe usa para simplificar la operación y se puede usar directamente inyectándolo en el proyecto

El modelo HelloWorld utiliza

productor de desarrollo

@Autowired
private RabbitTemplate rabbitTemplate;

@Test
public void testHello(){
    
    
  rabbitTemplate.convertAndSend("hello","hello world");
}

método convertAndSend: convertir y enviar. Se utiliza para convertir el mensaje en byte y luego enviarlo

  • Primer parámetro: el nombre de la cola
  • El segundo parámetro: el contenido del mensaje.

Después de ejecutar el productor, encontramos que no hay cola:
inserte la descripción de la imagen aquí
porque la creación de esta cola no se crea en el lado del productor sino en el lado del consumidor.

No tiene sentido crear una cola si no hay consumidores

Desarrollar consumidores

@Component
@RabbitListener(queuesToDeclare = @Queue("hello"))
public class HelloCustomer {
    
    

    @RabbitHandler
    public void receive1(String message){
    
    
        System.out.println("message = " + message);
    }
}

El consumidor debe tener una anotación @RabbitListener para escuchar en nombre del consumidor. En este punto, queremos que reciba los mensajes en la cola de saludo, pero esta cola aún no existe, por lo que usamos queuesToDeclare para declarar una cola aquí.

Entonces, ¿cómo obtenemos los mensajes en la cola? Podemos crear un método arbitrariamente y usar la anotación @RabbitHandler en él para representar el método de devolución de llamada para tomar mensajes de la cola.Podemos obtener el mensaje a través de los parámetros de este método de devolución de llamada.

Luego ejecutamos y descubrimos:
inserte la descripción de la imagen aquí
la cola creada en este modo es persistente de forma predeterminada, entonces, ¿cómo establecemos si es exclusiva o se elimina automáticamente?

Podemos usar la anotación @Queue:
inserte la descripción de la imagen aquí

La cola creada de forma predeterminada es persistente, no exclusiva y no se elimina automáticamente.

Uso del modelo de trabajo

productor de desarrollo

@Autowired
private RabbitTemplate rabbitTemplate;

@Test
public void testWork(){
    
    
  for (int i = 0; i < 10; i++) {
    
    
    rabbitTemplate.convertAndSend("work","hello work!");
  }
}

Desarrollar consumidores

@Component
public class WorkCustomer {
    
    
    @RabbitListener(queuesToDeclare = @Queue("work"))
    public void receive1(String message){
    
    
        System.out.println("work message1 = " + message);
    }

    @RabbitListener(queuesToDeclare = @Queue("work"))
    public void receive2(String message){
    
    
        System.out.println("work message2 = " + message);
    }
}

Aquí estamos construyendo múltiples consumidores en una clase. @RabbitListener se usa en clases, y @RabbitListener también se puede usar en métodos

说明:默认在Spring AMQP实现中Work这种方式就是公平调度,如果需要实现能者多劳需要额外配置

Modelo de transmisión fanout

productor de desarrollo

@Autowired
private RabbitTemplate rabbitTemplate;

@Test
public void testFanout() throws InterruptedException {
    
    
  rabbitTemplate.convertAndSend("logs","","这是日志广播");
}

convertir y enviar:

  • Primer parámetro: el nombre del interruptor
  • El segundo parámetro: clave de enrutamiento
  • El tercer parámetro: el mensaje generado

Del mismo modo, el cambio no está definido en el productor sino en el consumidor. Solo ejecutar el código anterior no creará un cambio de registro

Desarrollar consumidores

@Component
public class FanoutCustomer {
    
    

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue,  //创建临时队列
            exchange = @Exchange(name="logs",type = "fanout")  //绑定的交换机
    ))
    public void receive1(String message){
    
    
        System.out.println("message1 = " + message);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue, //创建临时队列
            exchange = @Exchange(name="logs",type = "fanout")  //绑定交换机类型
    ))
    public void receive2(String message){
    
    
        System.out.println("message2 = " + message);
    }
}

Modelo de enrutamiento de ruta

productor de desarrollo

@Autowired
private RabbitTemplate rabbitTemplate;

@Test
public void testDirect(){
    
    
  rabbitTemplate.convertAndSend("directs","error","error 的日志信息");
}

Desarrollar consumidores

@Component
public class DirectCustomer {
    
    

    @RabbitListener(bindings ={
    
    
            @QueueBinding(
                    value = @Queue(),
                    key={
    
    "info","error"},
                    exchange = @Exchange(type = "direct",name="directs")
            )})
    public void receive1(String message){
    
    
        System.out.println("message1 = " + message);
    }

    @RabbitListener(bindings ={
    
    
            @QueueBinding(
                    value = @Queue(),
                    key={
    
    "error"},
                    exchange = @Exchange(type = "direct",name="directs")
            )})
    public void receive2(String message){
    
    
        System.out.println("message2 = " + message);
    }
}

Modelo de suscripción de temas (modelo de enrutamiento dinámico)

productor de desarrollo

@Autowired
private RabbitTemplate rabbitTemplate;

//topic
@Test
public void testTopic(){
    
    
  rabbitTemplate.convertAndSend("topics","user.save.findAll","user.save.findAll 的消息");
}

Desarrollar consumidores

@Component
public class TopCustomer {
    
    
    @RabbitListener(bindings = {
    
    
            @QueueBinding(
                    value = @Queue,
                    key = {
    
    "user.*"},
                    exchange = @Exchange(type = "topic",name = "topics")
            )
    })
    public void receive1(String message){
    
    
        System.out.println("message1 = " + message);
    }

    @RabbitListener(bindings = {
    
    
            @QueueBinding(
                    value = @Queue,
                    key = {
    
    "user.#"},
                    exchange = @Exchange(type = "topic",name = "topics")
            )
    })
    public void receive2(String message){
    
    
        System.out.println("message2 = " + message);
    }
}

Supongo que te gusta

Origin blog.csdn.net/zyb18507175502/article/details/127690703
Recomendado
Clasificación