RabbitMQ延迟消息

RabbitMQ延迟消息

在项目中遇到了一个需要延迟发送消息的需求,经过一番探索找到了合适的解决方案,并且在本地进行了验证,这篇文章用于记录自己找到的方案,方便以后自己回顾,也方便有需要的人。

一、docker容器中运行rabbitmq

执行下面的命令,就可以创建一个运行rabbitmq的docker容器:

$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=mucao -e RABBITMQ_DEFAULT_PASS=123456 -e RABBITMQ_DEFAULT_VHOST=my_vhost -p 5672:5672 -p 15672:15672 rabbitmq:3-management

二、为容器中的rabbitmq安装延迟消息插件

插件所在仓库地址为:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange

下载好的插件文件名称为:rabbitmq_delayed_message_exchange-3.11.1.ez

在容器中执行rabbitmq命令查看插件存放路径:

$ rabbitmq-plugins directories -s

命令执行结果如下图所示:
在这里插入图片描述

使用docker命令将插件文件拷贝到容器中的插件存放目录下:

# 3aca0fe20cfc是容器的id
$ docker cp .\rabbitmq_delayed_message_exchange-3.11.1.ez 3aca0fe20cfc:/opt/rabbitmq/plugins

然后在rabbitmq容器中执行下面的命令,就可以开启延迟消息插件了:

$ rabbitmq-plugins enable rabbitmq_delayed_message_exchange

执行结果如下图所示:
在这里插入图片描述

三、创建延示例工程

直接在spring initializr选择web和rabbitmq依赖,如下图所示:
在这里插入图片描述

点击如图所示的"EXPLORE",进入到下载页面。

下载好的文件解压,然后使用idea打开就行了。

在application.yml文件中要把连接容器中rabbitmq的配置信息填写好,application.yml文件内容如下所示:

spring:
  rabbitmq:
    #ip
    host: 127.0.0.1
    #端口号
    port: 5672
    #虚拟host 可以不设置,使用server默认host,随你喜欢命名
    virtual-host: my_vhost
    #账号
    username: mucao
    #密码
    password: 123456

四、创建延迟队列的消费者

先给出消费者类在工程的位置,如下图所示:
在这里插入图片描述

消费者代码内容如下所示:

package com.mucao.studyRabbitMQ;

import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class DelayMessageConsumer {
    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue(name = "delay.queue", durable = "true"),
                    exchange = @Exchange(name = "delay.direct", delayed = "true"),
                    key = "delay"
            )
    )
    public void listenDelayExchange(String msg) {
        System.out.println("消费者收到了delay.queue的延迟消息:" + msg);
        System.out.println("收到消息的时间为:" + new Date());
    }
}

五、创建消息生产者

直接在单元测试中执行发送消息的逻辑。单元测试类在工程中的位置如下所示:
在这里插入图片描述

下面是单元测试类的内容:

package com.mucao.studyRabbitMQ;

import org.junit.jupiter.api.Test;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.UUID;

@SpringBootTest
class StudyRabbitMqApplicationTests {

	@Resource
	RabbitTemplate rabbitTemplate;

	@Test
	void testSendDelayMessage() {
		String routingKey = "delay";
		// 1、准备消息
		Message message = MessageBuilder
				.withBody("hello, TTL".getBytes(StandardCharsets.UTF_8))
				.setDeliveryMode(MessageDeliveryMode.PERSISTENT)
				.setHeader("x-delay", 5000)
				.build();
		// 2、准备CorrelationData
		CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
		// 3、发送消息
		rabbitTemplate.convertAndSend("delay.direct", routingKey, message, correlationData);
		System.out.println("发送消息成功,时间:" + new Date());
	}

}

六、执行结果

先执行延迟消息生产者,执行结果如下所示:
在这里插入图片描述

然后执行单元测试中的消息生产者,如下所示:
在这里插入图片描述

然后查看消息消费者的输出,如下所示:
在这里插入图片描述

从上述图中可以看到,从消息发出到消息接收,时间差刚好是5秒中,和预期是一致的。

参考资料

1、RabbitMQ延迟消息问题(含Demo工程)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值