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: