RabbitMQ入门指南(十一):延迟消息-延迟消息插件

前言

RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了DelayExchange插件、延迟消息插件实现延迟消息等内容。


一、DelayExchange插件

使用死信队列可以实现延迟消息,但这种方法过于繁琐。为了简化这一过程,RabbitMQ的官方推出了一款插件,该插件原生支持延迟消息功能。该插件的运作原理是设计了一种特殊的交换机,当消息投递到这种交换机时,它能够暂存一段时间,直到达到设定的延迟时间后再将消息投递到相应的队列。这种设计大大简化了延迟消息的处理过程,提高了系统的效率和可靠性。

官方文档:

Scheduling Messages with RabbitMQ | RabbitMQ

1.下载插件

插件下载地址:

Releases · rabbitmq/rabbitmq-delayed-message-exchange (github.com)

下载对应版本的插件:

2.安装插件

由于之前是基于Docker安装的RabbitMQ,所以需要查看RabbitMQ插件目录对应的数据卷:

复制代码
docker volume inspect mq-plugins

运行结果:

json 复制代码
[
    {
        "CreatedAt": "2023-12-15T09:57:39+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mq-plugins/_data",
        "Name": "mq-plugins",
        "Options": null,
        "Scope": "local"
    }
]

切换到指定的路径:

bash 复制代码
cd /var/lib/docker/volumes/mq-plugins/_data

上传插件到该目录下:

安装插件:

bash 复制代码
docker exec -it mq rabbitmq-plugins enable rabbitmq_delayed_message_exchange

运行结果:

二、延迟消息插件实现延迟消息

1.基于注解方式

在consumer服务基于@RabbitListener注解来声明队列、交换机和绑定队列和交换机,并且设置交换机为延迟交换机:

less 复制代码
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "delay.queue", durable = "true"),
            exchange = @Exchange(value = "delay.direct", delayed = "true"),
            key = "delay"
    ))
    public void listenDelayQueue(String msg) {
        log.info("delay.queue:" + msg);
    }
delayed = "true" 设置交换机为延迟交换机

2.基于@Bean方式

在consumer服务基于@Bean注解来声明交换机、队列和绑定队列和交换机,并且设置交换机为延迟交换机:

typescript 复制代码
@Configuration
public class DirectConfiguration {

    @Bean
    public DirectExchange delayExchange() {
        return ExchangeBuilder
                .directExchange("delay.direct")
                .delayed()
                .durable(true)
                .build();
    }

    @Bean
    public Queue delayedQueue() {
        return new Queue("delay.queue");
    }

    @Bean
    public Binding delayQueueBinding() {
        return BindingBuilder.bind(delayedQueue()).to(delayExchange()).with("delay");
    }
}
.delayed() 设置交换机为延迟交换机

3.声明结果

启动consumer服务,查看结果(注解方式和@Bean方式选一种):

4.延迟消息发送

在publisher服务中的测试类添加一个测试方法,通过消息头x-delay来设置过期时间,实现延迟消息发送:

java 复制代码
    @Test
    void testSendDelayMessage() {
        rabbitTemplate.convertAndSend("delay.direct", "delay", "hello", new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setDelay(10000);
                return message;
            }
        });
        log.info("消息发送成功");
    }
.setDelay() 通过消息头x-delay来设置消息的延迟时间

5.运行结果

publisher服务成功发送了一条消息,但consumer服务在10秒后才收到该消息,从而实现了延迟消息传递的目标:


总结

RabbitMQ是一个开源的消息队列软件,旨在提供可靠的消息传递和消息队列功能。本文主要介绍了DelayExchange插件、延迟消息插件实现延迟消息等内容,希望对大家有所帮助。

相关推荐
ai小鬼头39 分钟前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
Touper.1 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端
一只叫煤球的猫1 小时前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈
一只鹿鹿鹿1 小时前
信息化项目验收,软件工程评审和检查表单
大数据·人工智能·后端·智慧城市·软件工程
专注VB编程开发20年2 小时前
开机自动后台运行,在Windows服务中托管ASP.NET Core
windows·后端·asp.net
程序员岳焱2 小时前
Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
后端·mysql·性能优化
一只叫煤球的猫2 小时前
手撕@Transactional!别再问事务为什么失效了!Spring-tx源码全面解析!
后端·spring·面试
旷世奇才李先生3 小时前
Ruby 安装使用教程
开发语言·后端·ruby
Bug退退退1233 小时前
RabbitMQ 工作模式
java·分布式·rabbitmq
沃夫上校6 小时前
Feign调Post接口异常:Incomplete output stream
java·后端·微服务