RabbitMQ implémente la fonction de délai de file d'attente de messages

Pour implémenter la fonction de délai de file d'attente des messages de RabbitMQ, le plug-in officiel "rabbitmq_delayed_message_exchange" est généralement utilisé pour l'implémenter. Mais la version de RabbitMQ doit être 3.5.8 ou supérieure pour prendre en charge ce plug-in, sinon vous devez utiliser sa fonction "lettre morte".

1. Installez le plugin de délai RabbitMQ

(1) Vérifiez le plug-in

Utilisez la commande rabbitmq-plugins list pour afficher les plug-ins installés par RabbitMQ.

Ouvrez une nouvelle fenêtre cmd (appuyez sur la touche de raccourci "Win + R", entrez "cmd").

Exécutez la commande: rabbitmq-plugins list

Vérifiez l'installation du plug-in RabbitMQ:

(2) Téléchargez le plug-in

Si le plug-in n'est pas installé, accédez directement au site officiel pour continuer.

Adresse officielle de téléchargement: https://www.rabbitmq.com/community-plugins.html

(3) Installez le plug-in

Une fois le téléchargement terminé, décompressez-le dans le répertoire des plugins de RabbitMQ. Par exemple, mon chemin de répertoire est: D: \ Program Files \ RabbitMQ Server \ rabbitmq_server-3.8.9 \ plugins

Ouvrez une nouvelle fenêtre cmd (appuyez sur la touche de raccourci "Win + R", entrez "cmd").

Si le système a été configuré avec des variables d'environnement RabbitMQ, exécutez la commande suivante pour l'installer.

运行 命令 : rabbitmq-plugins activent rabbitmq_delayed_message_exchange

 

2. Implémentez la fonction de délai de file d'attente de messages RabbitMQ

[Exemple] Créez un projet SpringBoot pour implémenter la fonction de délai de file d'attente de messages RabbitMQ.

(1) Utilisez Maven pour ajouter des fichiers dépendants

Dans le fichier d'informations de configuration pom.xml, ajoutez les fichiers dépendants associés:

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

(2) Configuration de RabbitMQ

Configurez les informations RabbitMQ dans le fichier de configuration application.yml:

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

(3) Classe de configuration RabbitMQ

Créez le package com.pjb.config et créez la classe RabbitMqConfig (classe de configuration RabbitMQ) pour configurer le commutateur.

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) Réaliser l'envoi de message

Réalisez l'envoi du message, définissez ici le délai de message de 5 s.

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) Réaliser la réception du message

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) Test d'envoi de message retardé

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

Résultats de la:

 

Je suppose que tu aimes

Origine blog.csdn.net/pan_junbiao/article/details/112711560
conseillé
Classement