springboot 整合 rabbitMQ (延迟队列)

前言:

延迟队列是一个内部有序的数据结构,其主要功能体现在其延时特性上。这种队列存储的元素都设定了特定的处理时间,意味着它们需要在规定的时间点或者延迟之后才能被取出并进行相应的处理。简而言之,延时队列被设计用于存放那些需要在特定时间到达时才处理的元素。

使用场景:

1、定时任务调度:在任务调度系统中,延时队列可以用来安排任务在未来的某个时间点执行,比如定时发送邮件、消息推送、定时刷新缓存等。

2、订单超时取消:在电子商务网站中,未在规定时间内完成的订单可以通过延时队列来设置超时取消,如果订单在队列规定的延迟时间内没有被支付,系统将会自动取消订单。

3、消息重试机制:在消息队列中,如果消息处理失败了,可以将消息放入延时队列中,等待一段时间后再次尝试处理,以实现重试机制。

4、缓存数据过期:对于缓存系统,延时队列可以用来管理数据的过期时间,当数据在队列中的时间超过了设定的延迟时间,就将其从缓存中移除。

5、会话管理:在Web应用中,可以使用延时队列来管理用户会话的过期时间,当会话超过设定的有效时间后,系统将自动销毁会话。

6、任务延迟执行:有些任务可能需要在特定的时间窗口之后执行,比如数据分析任务可能需要在当天结束后才能进行,延时队列可以用来实现这种延迟执行。

7、权限验证Token过期:在安全系统中,发放的Token通常有有效时间,延时队列可以用来检测Token是否过期,并在过期时将其从系统中移除。

配置类:

配置文件

启动创建延迟队列和交换机

/**

* 延迟队列

*/

@Configuration

public class DelayedQueueConfig {

/** 队列 */

public static final String DELAYED_QUEUE_NAME="delayed_queue";

/** 交换机 */

public static final String DELAYED_EXCHANGE_NAME="delayed_exchange";

/** 交换机类型 */

public static final String DELAYED_EXCHANGE_TYPE="x-delayed-message";

/** 交换机路由键 */

public static final String DELAYED_ROUTING_KEY="delayed";

复制代码
/\*\* 声明延迟队列 \*/
@Bean
public Queue delayedQueue() {
    return new Queue(DELAYED\_QUEUE\_NAME);
}

/\*\* 声明延迟队列交换机 \*/
@Bean
public CustomExchange delayedExchange() {
    Map<String, Object> map = new HashMap<>();
    map.put("x-delayed-type", "direct");
    /\*\*
     \* 声明自定义交换机
     \* 第一个参数: 交换机名称
     \* 第二个参数: 交换机类型
     \* 第三个参数: 是否需要持久化
     \* 第四个参数: 是否自动删除
     \* 第五个参数: 其他参数
     \*/
    return new CustomExchange(DELAYED\_EXCHANGE\_NAME, DELAYED\_EXCHANGE\_TYPE, true, false, map);
}

/\*\* 绑定队列和延迟交换机 \*/
@Bean
public Binding delayedQueueBindingDelayedExchange(
        @Qualifier("delayedQueue") Queue delayedQueue,
        @Qualifier("delayedExchange") Exchange delayedExchange
) {
    return BindingBuilder.bind(delayedQueue).to(delayedExchange).with(DELAYED\_ROUTING\_KEY).noargs();
}

}

生产者:

示例:商城项目生成订单后超过30分钟不支付自动取消订单

第一个参数:交换机名称

第二个参数:路由键

第三个参数:消息体

第四个参数:消息后处理器

复制代码
//将订单id放入延迟队列 延迟30分钟后没有支付取消订单 释放库存          

rabbitTemplate.convertAndSend(DelayedQueueConfig.DELAYED_EXCHANGE_NAME,DelayedQueueConfig.DELAYED_ROUTING_KEY,mallOrder.getId(),message -> {
                //设置到期时间 方便测试这里设置30秒
                message.getMessageProperties().setDelay(10000);
                return message;
            });

消费者:

复制代码
@RabbitListener(queuesToDeclare =@Queue(DelayedQueueConfig.DELAYED_QUEUE_NAME))
    public void consume(Integer orderId, Message message, Channel channel) {
        log.info("延时队列监听到消息,订单id为:{}", orderId);
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        //接收消息后代码
        
        try {
            //手动提交
            channel.basicAck(deliveryTag, false);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
相关推荐
半旧夜夏1 小时前
【设计模式】核心设计模式实战
java·spring boot·设计模式
皮皮林5511 小时前
SpringBoot 控制台秒变炫彩特效,秀翻同事指南!
spring boot
IT学长编程2 小时前
计算机毕设选题 基于SpringBoot的书店管理系统的设计与实现 网上书店系统 前后端分离 Java毕设项目 毕业设计选题 【附源码+文档报告+安装调试】
java·spring boot·毕业设计·课程设计·前后端分离·网上书店系统·书店管理系统
IT学长编程2 小时前
计算机毕设选题 基于SpringBoot的房产租赁管理系统 房屋租赁系统 前后端分离 Java毕设项目 毕业设计选题 【附源码+文档报告+安装调试】
java·spring boot·毕业设计·课程设计·房屋租赁系统·房产租赁系统·文档报告
李慕婉学姐3 小时前
【开题答辩过程】以《基于 Spring Boot 的宠物应急救援系统设计与实现》为例,不会开题答辩的可以进来看看
数据库·spring boot·宠物
一只大头猿4 小时前
基于SpringBoot和Vue的超市管理系统
前端·vue.js·spring boot
荣光波比4 小时前
RabbitMQ高可用集群搭建教程(基于CentOS 7.9 + Erlang 23.2.7 + RabbitMQ 3.8.8)
运维·centos·rabbitmq·erlang
YQ_ZJH5 小时前
Spring Boot 如何校验前端传递的参数
前端·spring boot·后端
MX_93596 小时前
SpringBoot项目优先级以及bean的管理
java·spring boot·后端·spring