RabbitMQ implementa la función de retardo de la cola de mensajes

Para implementar la función de retardo de la cola de mensajes de RabbitMQ, generalmente se usa el complemento oficial "rabbitmq_delayed_message_exchange" para implementarlo. Pero la versión de RabbitMQ debe ser 3.5.8 o superior para admitir este complemento; de lo contrario, debe usar su función de "letra muerta".

1. Instale el complemento de retardo RabbitMQ

(1) Compruebe el complemento

Utilice el comando rabbitmq-plugins list para ver los complementos instalados por RabbitMQ.

Abra una nueva ventana de cmd (presione la tecla de método abreviado "Win + R", ingrese "cmd").

Ejecute el comando: rabbitmq-plugins list

Compruebe la instalación del complemento RabbitMQ:

(2) Descargue el complemento

Si el complemento no está instalado, vaya directamente al sitio web oficial para continuar.

Dirección de descarga oficial: https://www.rabbitmq.com/community-plugins.html

(3) Instale el complemento

Una vez completada la descarga, descomprímalo en el directorio de complementos de RabbitMQ. Por ejemplo, la ruta de mi directorio es: D: \ Archivos de programa \ RabbitMQ Server \ rabbitmq_server-3.8.9 \ plugins

Abra una nueva ventana de cmd (presione la tecla de método abreviado "Win + R", ingrese "cmd").

Si el sistema se ha configurado con variables de entorno RabbitMQ, ejecute el siguiente comando para instalarlo.

运行 命令 : rabbitmq-plugins habilita rabbitmq_delayed_message_exchange

 

2. Implementar la función de retardo de la cola de mensajes de RabbitMQ

[Ejemplo] Cree un proyecto SpringBoot para implementar la función de retardo de la cola de mensajes de RabbitMQ.

(1) Utilice Maven para agregar archivos dependientes

En el archivo de información de configuración pom.xml, agregue los archivos dependientes relacionados:

<!-- AMQP客户端 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
    <version>2.4.1</version>
</dependency>

(2) Configuración de RabbitMQ

Configure la información de RabbitMQ en el archivo de configuración application.yml:

spring:
  # 项目名称
  application:
    name: rabbitmq-delayed
  # RabbitMQ服务配置
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

(3) Clase de configuración RabbitMQ

Cree el paquete com.pjb.config y cree la clase RabbitMqConfig (clase de configuración RabbitMQ) para configurar el conmutador.

package com.pjb.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;


/**
 * RabbitMQ配置类
 * @author pan_junbiao
 **/
@Configuration
public class RabbitMqConfig
{
    public static final String DELAY_EXCHANGE_NAME = "delayed_exchange";
    public static final String DELAY_QUEUE_NAME = "delay_queue_name";
    public static final String DELAY_ROUTING_KEY = "delay_routing_key";

    @Bean
    public CustomExchange delayExchange()
    {
        Map<String, Object> args = new HashMap<>();
        args.put("x-delayed-type", "direct");
        return new CustomExchange(DELAY_EXCHANGE_NAME, "x-delayed-message", true, false, args);
    }

    @Bean
    public Queue queue()
    {
        Queue queue = new Queue(DELAY_QUEUE_NAME, true);
        return queue;
    }

    @Bean
    public Binding binding(Queue queue, CustomExchange delayExchange)
    {
        return BindingBuilder.bind(queue).to(delayExchange).with(DELAY_ROUTING_KEY).noargs();
    }
}

(4) Realice el envío de mensajes

Realice el envío del mensaje, aquí configure el retraso del mensaje 5s.

package com.pjb.mq;

import com.pjb.config.RabbitMqConfig;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 消息发送者
 * @author pan_junbiao
 **/
@Service
public class CustomSender
{
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendMsg(String msg)
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("消息发送时间:" + sdf.format(new Date()));
        rabbitTemplate.convertAndSend(RabbitMqConfig.DELAY_EXCHANGE_NAME, RabbitMqConfig.DELAY_ROUTING_KEY, msg, new MessagePostProcessor()
        {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException
            {
                //消息延迟5秒
                message.getMessageProperties().setHeader("x-delay", 5000);
                return message;
            }
        });
    }
}

(5) Realice la recepción de mensajes

package com.pjb.mq;

import com.pjb.config.RabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 消息接收者
 * @author pan_junbiao
 **/
@Component
public class CustomReceiver
{
    @RabbitListener(queues = RabbitMqConfig.DELAY_QUEUE_NAME)
    public void receive(String msg)
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(new Date())+msg);
        System.out.println("Receiver:执行取消订单");
    }
}

(6) Prueba de envío de mensaje retrasado

package com.pjb;

import com.pjb.mq.CustomSender;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * RabbitMQ测试类
 * @author pan_junbiao
 **/
@SpringBootTest
public class MQTest
{
    @Autowired
    private CustomSender customSender;

    @Test
    public void send() throws Exception
    {
        //发送消息
        customSender.sendMsg("支付超时,取消订单通知!");

        //程序延时15秒,否则程序立即执行完毕,则控制台无法看到消息队列延迟的结果
        Thread.sleep(15000);
    }
}

Resultados del:

 

Supongo que te gusta

Origin blog.csdn.net/pan_junbiao/article/details/112711560
Recomendado
Clasificación