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: