RabbitMQ implementiert die Verzögerungsfunktion für die Nachrichtenwarteschlange

Um die Verzögerungsfunktion für die Nachrichtenwarteschlange von RabbitMQ zu implementieren, wird im Allgemeinen das offizielle Plug-In "rabbitmq_delayed_message_exchange" verwendet, um sie zu implementieren. Die RabbitMQ-Version muss jedoch 3.5.8 oder höher sein, um dieses Plug-In zu unterstützen. Andernfalls müssen Sie die Funktion "Dead Letter" verwenden.

1. Installieren Sie das RabbitMQ Delay Plugin

(1) Überprüfen Sie das Plug-In

Verwenden Sie den Befehl rabbitmq-plugins list, um die von RabbitMQ installierten Plug-Ins anzuzeigen.

Öffnen Sie ein neues Cmd-Fenster (drücken Sie die Tastenkombination "Win + R", geben Sie "cmd" ein).

Führen Sie den Befehl aus: rabbitmq-plugins list

Überprüfen Sie die Installation des RabbitMQ-Plug-Ins:

(2) Laden Sie das Plug-In herunter

Wenn das Plug-In nicht installiert ist, rufen Sie direkt die offizielle Website auf, um fortzufahren.

Offizielle Download-Adresse: https://www.rabbitmq.com/community-plugins.html

(3) Installieren Sie das Plug-In

Nachdem der Download abgeschlossen ist, entpacken Sie ihn in das Plugins-Verzeichnis von RabbitMQ. Mein Verzeichnispfad lautet beispielsweise: D: \ Programme \ RabbitMQ Server \ rabbitmq_server-3.8.9 \ plugins

Öffnen Sie ein neues Cmd-Fenster (drücken Sie die Tastenkombination "Win + R", geben Sie "cmd" ein).

Wenn das System mit RabbitMQ-Umgebungsvariablen konfiguriert wurde, führen Sie den folgenden Befehl aus, um es zu installieren.

运行 命令 : rabbitmq-Plugins aktivieren rabbitmq_delayed_message_exchange

 

2. Implementieren Sie die Verzögerungsfunktion für die RabbitMQ-Nachrichtenwarteschlange

[Beispiel] Erstellen Sie ein SpringBoot-Projekt, um die Verzögerungsfunktion für die RabbitMQ-Nachrichtenwarteschlange zu implementieren.

(1) Verwenden Sie Maven, um abhängige Dateien hinzuzufügen

Fügen Sie in der Konfigurationsinformationsdatei pom.xml verwandte abhängige Dateien hinzu:

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

(2) RabbitMQ-Konfiguration

Konfigurieren Sie RabbitMQ-Informationen in der Konfigurationsdatei application.yml:

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

(3) RabbitMQ-Konfigurationsklasse

Erstellen Sie das Paket com.pjb.config und erstellen Sie die RabbitMqConfig-Klasse (RabbitMQ-Konfigurationsklasse), um den Switch zu konfigurieren.

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) Realisieren Sie das Senden von Nachrichten

Realisieren Sie das Senden von Nachrichten. Stellen Sie hier die Nachrichtenverzögerung auf 5s ein.

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) Nachrichtenempfang realisieren

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) Testen Sie das Senden einer verzögerten Nachricht

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);
    }
}

Ergebnisse der:

 

Ich denke du magst

Origin blog.csdn.net/pan_junbiao/article/details/112711560
Empfohlen
Rangfolge