RabbitMq实现延迟队列功能

1、rabbitmq服务端打开延迟插件 (超过 4294967295毫秒 ≈ 1193 小时 ≈ 49.7 天 这个时间会立即触发)

注意:只有RabbitMQ 3.6.x以上才支持

在下载好之后,解压得到.ez结尾的插件包,将其复制到RabbitMQ安装目录下的plugins文件夹。

然后通过命令行启用该插件:

|-------------------------------------------------------------------|
| rabbitmq-plugins enable rabbitmq_delayed_message_exchange |

该插件在通过上述命令启用后就可以直接使用,不需要重启。

2、添加依赖

复制代码
<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-amqp</artifactId>
 </dependency>

3、配置交换机和队列

复制代码
@Configuration
public class DelayedConfig {

    public static String EXCHANGE_NAME = "delayed_exchange";
    public static String QUEUE_NAME = "delayed_queue";
    public static String KEY_NAME = "delayed_key";

    /**
     * 基于插件实现的交换机,必须是CustomExchange类型,标识这是一个延时类型的交换机
     */
    @Bean()
    public CustomExchange delayedExchange(){
        Map<String,Object> params = new HashMap<>();
        params.put("x-delayed-type","direct");
        //参数1:交换机名字,参数2:交换机的类型,参数3:是否持久化,参数4:是否自动删除队列,参数5:交换机的额外参数设置
        return new CustomExchange(EXCHANGE_NAME,"x-delayed-message",true,false,params);
    }

    @Bean()
    public Queue delayedQueue(){
        return new Queue(QUEUE_NAME);
    }

    @Bean
    public Binding delayedBinding(){
        return BindingBuilder.bind(delayedQueue()).to(delayedExchange()).with(KEY_NAME).noargs();
    }

}

4、发送和接收消息

复制代码
@GetMapping("/t5")
    public void t5(){
        Date date = new Date();
        System.out.println("发送时间:" + date.toString());
        //发送消息
        rabbitTemplate.convertAndSend(DelayedConfig.EXCHANGE_NAME,DelayedConfig.KEY_NAME,"1延迟消息wxm",
            msg->{msg.getMessageProperties().setHeader(MessageProperties.X_DELAY, 15552000000L);
                  msg.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
                return msg;});
        //发送消息
        rabbitTemplate.convertAndSend(DelayedConfig.EXCHANGE_NAME,DelayedConfig.KEY_NAME,"延迟消息wxm",
            msg->{msg.getMessageProperties().setDelay(10000);
                msg.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
                return msg;});
        log.info("发送成功");
    }
    @RabbitHandler
    @RabbitListener(queues = "delayed_queue")
    public void getDelayed(Message message, Channel channel) throws Exception{
        Date date = new Date();
        String rightNow = date.toString();
        String msg = new String(message.getBody());
        // 手动应答
        System.out.println(message.getMessageProperties().getDeliveryTag());
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
        System.out.println("接受成功:"+msg+rightNow);
    }
相关推荐
smallyoung2 小时前
告别N+1:Spring Boot 一键数据翻译框架体系
java·后端·架构
Bazingga3 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
对象存储与RustFS3 小时前
网盘限速逼你开会员?用 RustFS 自己搭一个不限速的“私人网盘
服务器·后端·docker
SL_staff5 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3275 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar5 小时前
Java封装、继承、多态
java·开发语言
..Dauntless..5 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
裕晟资质规划5 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络
ly76895 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠5 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言