From c5db1c49db1292e5ede0669cdc0d95801848e94a Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Mon, 19 May 2025 17:00:42 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=BB=B6=E8=BF=9F=E9=98=9F?= =?UTF-8?q?=E5=88=97=E5=AE=8C=E6=88=90;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mq-demo/ReadMe.md | 144 +++++++++++++++++- mq-demo/images/image-20250519164038005.png | Bin 0 -> 15059 bytes mq-demo/images/image-20250519164337295.png | Bin 0 -> 11341 bytes ...abbitmq_delayed_message_exchange-3.13.0.ez | Bin 0 -> 45228 bytes .../mq/listener/MessageListenerOrder.java | 51 ++++--- .../mq/mqdemo/MqDemoApplicationTests.java | 21 +++ 6 files changed, 193 insertions(+), 23 deletions(-) create mode 100644 mq-demo/images/image-20250519164038005.png create mode 100644 mq-demo/images/image-20250519164337295.png create mode 100644 mq-demo/rabbitmq_delayed_message_exchange-3.13.0.ez diff --git a/mq-demo/ReadMe.md b/mq-demo/ReadMe.md index df27b46..d183fa9 100644 --- a/mq-demo/ReadMe.md +++ b/mq-demo/ReadMe.md @@ -1,5 +1,18 @@ # RabbitMQ +**安装RabbitMQ** + +```bash +docker run -d --name rabbitmq_master --restart=always \ +-p 5672:5672 -p 15672:15672 \ +-v ~/docker/docker_data/rabbitmq/rabbitmq_master/data:/var/lib/rabbitmq_master \ +-v ~/docker/docker_data/rabbitmq/rabbitmq_master/conf:/etc/rabbitmq_master \ +-v ~/docker/docker_data/rabbitmq/rabbitmq_master/log:/var/log/rabbitmq_master \ +-e RABBITMQ_DEFAULT_VHOST=rabbitmq_master \ +-e RABBITMQ_DEFAULT_USER=admin \ +-e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.13.7-management +``` + ## 基本示例 **生产者** @@ -575,4 +588,133 @@ void buildExchangeOverflowTest() { 在之前设置中,消息最大接受是10,最多只能接收到10条消息,之后溢出消息进入死信,其中有10条消息是因为延迟,进入了死信。 -![image-20250519154653646](./images/image-20250519154653646.png) \ No newline at end of file +![image-20250519154653646](./images/image-20250519154653646.png) + +## 延迟队列 + +### 应用场景 + +- 订单超时未支付自动取消 +- 预约任务延迟触发 +- 重试机制中的延迟重试 + +#### 实现方案对比 + +| 方案 | 优点 | 缺点 | +| :----------- | :------------------- | :---------------------------- | +| TTL+死信队列 | 无需插件 | 队列级别TTL,灵活性差 | +| 延迟消息插件 | 消息级延迟,精确控制 | 需安装插件,延迟有上限(2天) | + +### 安装插件 + +如果不想下,这个文档代码仓库中有的,在根目录下`rabbitmq_delayed_message_exchange-3.13.0.ez` + +> [!WARNING] +> +> 插件限制: +> +> - 最大延迟时间:**2天(48小时)** +> - 必须匹配RabbitMQ版本 + +#### 1、确认docker数据卷 + +```bash +docker inspect rabbitmq_master | grep -A 10 Mounts +``` + +找到`Mounts`,如果挂在了`plugins`下载后放到这个目录中,当前版本无法创建`/plugins`目录,只能手动下载之后移入。参考下面的第二点。 + +若未挂载`/plugins`目录,需手动拷贝插件文件: + +```bash +docker cp rabbitmq_delayed_message_exchange-3.13.0.ez rabbitmq_master:/plugins/ +``` + +#### 2、安装插件 + +**安装步骤** + +需要注意,版本是否对应上,我当前RabbitMQ版本是`rabbitmq:3.13.7-management` + +```bash +# 下载插件(版本必须匹配) +wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v3.13.0/rabbitmq_delayed_message_exchange-3.13.0.ez + +# 启用插件 +docker exec rabbitmq_master rabbitmq-plugins enable rabbitmq_delayed_message_exchange + +# 重启容器生效 +docker restart rabbitmq_master +``` + +**验证安装** + +```bash +docker exec rabbitmq_master rabbitmq-plugins list | grep delay +``` + +应输出:`[E*] rabbitmq_delayed_message_exchange` + +### 测试环境配置 + +#### **1. 创建延迟交换机** + +- 名称:`exchange.test.delay` +- 类型:`x-delayed-message` +- **必须参数**: + +```json +{ + "x-delayed-type": "direct" // 指定底层交换机类型(direct/topic/fanout) +} +``` + +> [!IMPORTANT] +> +> 在指定交换机时,因为本身的Type类型已经设置成了`x-delayed-message`,但是又没有指定交换机类型,又必须指定交换机类型,所以指定下面参数选项中设置延迟交换机的类型。 +> +> 需要在下面参数中设置:`x-delayed-type:交换机类型`。 + +![image-20250519164038005](./images/image-20250519164038005.png) + +#### **2. 创建队列与绑定** + +- 队列:`queue.test.delay`(无需特殊参数) +- 路由键:`routing.key.test.delay` + +![image-20250519164337295](./images/image-20250519164337295.png) + +### 测试Code + +**生产者端** + +```java +/* 测试延迟消息 */ +@Test +void delayedPublishTest() { + + // 在下面测试中,如果没有安装延迟插件,设置了 x-delay 没有作用 + MessagePostProcessor messagePostProcessor = message -> { + // 10秒延迟 + message.getMessageProperties().setHeader("x-delay", 10000); + return message; + }; + + rabbitTemplate.convertAndSend("exchange.test.delay", + "routing.key.test.delay", + "延迟消息插件:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), + messagePostProcessor + ); +} +``` + +**消费者端** + +```java +/* 测试延迟消息 */ +@RabbitListener(queues = "queue.test.delay") +public void processMessageDelay(String dataString, Channel channel, Message message) throws IOException, InterruptedException { + log.info("<延迟消息>----消息本身{}", dataString); + log.info("<延迟消息>----当前时间{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); +} +``` \ No newline at end of file diff --git a/mq-demo/images/image-20250519164038005.png b/mq-demo/images/image-20250519164038005.png new file mode 100644 index 0000000000000000000000000000000000000000..c85922a8d1dbf21f730fb6b59c4c9fcaaca2d4e2 GIT binary patch literal 15059 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 G@P7b5LjSq| literal 0 HcmV?d00001 diff --git a/mq-demo/images/image-20250519164337295.png b/mq-demo/images/image-20250519164337295.png new file mode 100644 index 0000000000000000000000000000000000000000..25d51c77931ea53a969d44b8bd81f7e5851aa361 GIT binary patch literal 11341 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 AO8@`> literal 0 HcmV?d00001 diff --git a/mq-demo/src/main/java/cn/bunny/mq/mqdemo/mq/listener/MessageListenerOrder.java b/mq-demo/src/main/java/cn/bunny/mq/mqdemo/mq/listener/MessageListenerOrder.java index 9bef018..30556ab 100644 --- a/mq-demo/src/main/java/cn/bunny/mq/mqdemo/mq/listener/MessageListenerOrder.java +++ b/mq-demo/src/main/java/cn/bunny/mq/mqdemo/mq/listener/MessageListenerOrder.java @@ -7,9 +7,8 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; import java.io.IOException; -import java.util.concurrent.TimeUnit; - -import static cn.bunny.mq.mqdemo.domain.RabbitMQMessageListenerConstants.QUEUE_NAME; +import java.text.SimpleDateFormat; +import java.util.Date; @Component @Slf4j @@ -59,26 +58,34 @@ public class MessageListenerOrder { // } // } - @RabbitListener(queues = {QUEUE_NAME}) - public void processMessagePrefetch(String dataString, Channel channel, Message message) throws IOException, InterruptedException { - log.info("消费者 消息内容:{}", dataString); + // @RabbitListener(queues = {QUEUE_NAME}) + // public void processMessagePrefetch(String dataString, Channel channel, Message message) throws IOException, InterruptedException { + // log.info("消费者 消息内容:{}", dataString); + // + // TimeUnit.SECONDS.sleep(1); + // + // channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + // } + // + // /* 测试死信---监听正常队列 */ + // @RabbitListener(queues = {"queue.normal.video"}) + // public void processMessageNormal(String dataString, Channel channel, Message message) throws IOException, InterruptedException { + // log.info("监听正常队列----接受到:{}", dataString); + // channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); + // } + // + // /* 测试死信---监听死信队列 */ + // @RabbitListener(queues = {"queue.dead.letter.video"}) + // public void processMessageDeadLetter(String dataString, Channel channel, Message message) throws IOException, InterruptedException { + // log.info("监听死信队列----接收到:{}", dataString); + // channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + // } - TimeUnit.SECONDS.sleep(1); - - channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + /* 测试延迟消息 */ + @RabbitListener(queues = "queue.test.delay") + public void processMessageDelay(String dataString, Channel channel, Message message) throws IOException, InterruptedException { + log.info("<延迟消息>----消息本身{}", dataString); + log.info("<延迟消息>----当前时间{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } - /* *//* 测试死信---监听正常队列 *//* - @RabbitListener(queues = {"queue.normal.video"}) - public void processMessageNormal(String dataString, Channel channel, Message message) throws IOException, InterruptedException { - log.info("监听正常队列----接受到:{}", dataString); - channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); - } - - *//* 测试死信---监听死信队列 *//* - @RabbitListener(queues = {"queue.dead.letter.video"}) - public void processMessageDeadLetter(String dataString, Channel channel, Message message) throws IOException, InterruptedException { - log.info("监听死信队列----接收到:{}", dataString); - channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); - } */ } diff --git a/mq-demo/src/test/java/cn/bunny/mq/mqdemo/MqDemoApplicationTests.java b/mq-demo/src/test/java/cn/bunny/mq/mqdemo/MqDemoApplicationTests.java index 93a0770..0b8711a 100644 --- a/mq-demo/src/test/java/cn/bunny/mq/mqdemo/MqDemoApplicationTests.java +++ b/mq-demo/src/test/java/cn/bunny/mq/mqdemo/MqDemoApplicationTests.java @@ -9,6 +9,9 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.text.SimpleDateFormat; +import java.util.Date; + @SpringBootTest class MqDemoApplicationTests { @@ -96,4 +99,22 @@ class MqDemoApplicationTests { rabbitTemplate.convertAndSend(EXCHANGE, ROUTING_KEY, "因超时或移除产生死信【" + i + "】"); } } + + /* 测试延迟消息 */ + @Test + void delayedPublishTest() { + + // 在下面测试中,如果没有安装延迟插件,设置了 x-delay 没有作用 + MessagePostProcessor messagePostProcessor = message -> { + // 10秒延迟 + message.getMessageProperties().setHeader("x-delay", 10000); + return message; + }; + + rabbitTemplate.convertAndSend("exchange.test.delay", + "routing.key.test.delay", + "延迟消息插件:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), + messagePostProcessor + ); + } }