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);
    }
相关推荐
鸠摩智首席音效师5 小时前
linux 系统中 Shutting Down, Restarting, Halting 有什么区别 ?
linux·运维·服务器
CIb0la5 小时前
Linux 将继续不支持 HDMI 2.1 实现
linux·运维·服务器
CoderYanger6 小时前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
C++业余爱好者6 小时前
Java 提供了8种基本数据类型及封装类型介绍
java·开发语言·python
想用offer打牌6 小时前
RocketMQ如何防止消息丢失?
java·后端·架构·开源·rocketmq
皮卡龙6 小时前
Java常用的JSON
java·开发语言·spring boot·json
利刃大大7 小时前
【JavaSE】十三、枚举类Enum && Lambda表达式 && 列表排序常见写法
java·开发语言·枚举·lambda·排序
float_六七7 小时前
Java反射:万能遥控器拆解编程
java·开发语言
han_hanker7 小时前
java 异常类——详解
java·开发语言
源码获取_wx:Fegn08957 小时前
基于springboot + vue健身房管理系统
java·开发语言·前端·vue.js·spring boot·后端·spring