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 小时前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt
云烟成雨TD5 小时前
Spring AI 1.x 系列【54】Retry 机制分析
java·人工智能·spring
weixin_523185325 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
点燃大海5 小时前
SpringAI构建智能体
java·spring boot·spring·springai智能体
xier_ran5 小时前
【infra之路】02_RadixAttention与KV_Cache管理
java·spring boot·spring
黄同学real5 小时前
解决 Visual Studio Web Deploy 远程发布报 401 未授权 (ERROR\_USER\_UNAUTHORIZED)
服务器
黑马师兄6 小时前
RAG混合检索深度解析:让AI真正找到你要的内容
java·人工智能·ai·agent·rag·ai-native
码客日记6 小时前
Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)
java·spring boot·git
天天进步20156 小时前
Tunnelto 源码解析 #9:控制服务器设计:Warp、WebSocket、Ping/Pong 与连接保活
运维·服务器·websocket
凡人叶枫6 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发