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);
        }
    }
相关推荐
Nyarlathotep01133 分钟前
SpringBoot Starter的用法以及原理
java·spring boot
dkbnull19 小时前
深入理解Spring两大特性:IoC和AOP
spring boot
初次攀爬者19 小时前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
洋洋技术笔记1 天前
Spring Boot条件注解详解
java·spring boot
洋洋技术笔记2 天前
Spring Boot配置管理最佳实践
spring boot
用户8307196840823 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
大道至简Edward3 天前
Spring Boot 2.7 + JDK 8 升级到 Spring Boot 3.x + JDK 17 完整指南
spring boot·后端
洋洋技术笔记3 天前
Spring Boot启动流程解析
spring boot·后端
怒放吧德德3 天前
Spring Boot 实战:RSA+AES 接口全链路加解密(防篡改 / 防重放)
java·spring boot·后端
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端