前言
之前使用redis实现了消息队列,但是没有延迟消费的功能,现在编写一个可以实现延迟消费的功能,同时也能满足及时消费,只需要将延迟时间设置0就行了,用到了Redission,不需要基于stream进行一些复杂配置。
原理概述
Redisson 将任务按照预定的执行时间存储在 zset 中,任务的执行时间作为 score,任务本身序列化后的数据作为 member。同时,Redisson 会在后台持续监控这个 ZSET,一旦发现有符合执行条件(当前时间 >= score)的任务,就会自动将这些任务转移到另一个 RQueue(Redisson 的队列实现)中,应用程序只需要从 RQueue 中取出任务执行即可。
参考文章
【redis缓存】怎么使用 Redis 实现一个延时队列?_redis实现延时队列-CSDN博客
Redisson 的延迟队列真的能用吗?一文看透原理 + 坑点_redission延时队列原理-CSDN博客
Spring Boot 集成 Redisson 实现消息队列_springboot redis消息队列-CSDN博客
【使用redisson完成延迟队列的功能】使用redisson配合线程池完成异步执行功能,延迟队列和不需要延迟的队列_redisson延时阻塞队列-CSDN博客
引入相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.18</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.7.18</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.23.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.13.5</version>
</dependency>
配置文件
server:
port: ${SERVER_PORT:9211}
# Spring
spring:
application:
# 应用名称
name: ruoyi-redis-msg
redis:
host: localhost
port: 6379
password: 123456
mvc:
pathmatch:
matching-strategy: ant_path_matcher
# redission延迟队列相关配置
redission:
delayqueue:
enable: true # 是否启用
# handler线程池配置
# 当任务数≤corePoolSize时:所有任务由核心线程直接执行
# 当corePoolSize<任务数≤blockingQueueNum+corePoolSize时:
# 前corePoolSize个任务由核心线程执行 剩余任务会触发线程扩容(最多到maximumPoolSize个线程),后面的任务进入队列等待
# 当任务数>blockingQueueNum+corePoolSize时:将触发拒绝策略(默认是AbortPolicy)
handlerConfig:
corePoolSize: 5 # 核心线程数:线程池中保持活跃的最小线程数,即使它们处于空闲状态
maximumPoolSize: 10 # 最大线程数: 线程池允许创建的最大线程数
keepAliveTime: 30 # 空闲线程存活时间:当线程数超过核心线程数时,多余的空闲线程在终止前等待新任务的最长时间
blockingQueueNum: 1000 # 队列的最大容量为1000个任务当队列已满时,新提交的任务会被阻塞(取决于线程池的拒绝策略)
deadLine: dead_line # 死信队列名前缀
queueThreads: 1 # 监听队列的线程数,不宜设置过大,范围建议1-5
queueConfigs:
- queueName: goodsDelayQueue # 延迟队列名 Redis Key
beanId: goodsDelayConsumeHandler # 延迟队列具体业务实现的Bean,可通过Spring的上下文获取
desc: 商品消费的延迟队列 # 延迟队列名描述
- queueName: orderDelayQueue
beanId: orderDelayConsumeHandler
desc: 订单消费的延迟队列
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
@ConfigurationProperties(prefix = "redission.delayqueue")
@Slf4j
@Data
public class RedisDelayQueueConfigProperties {
private List<QueueConfig> queueConfigs;
private HandlerConfig handlerConfig;
private String deadLine;
private int queueThreads;
@Data
public static class QueueConfig {
private String queueName;
private String desc;
private String beanId;
}
@Data
public static class HandlerConfig {
private int corePoolSize;
private int maximumPoolSize;
private long keepAliveTime;
private int blockingQueueNum;
}
}

573

被折叠的 条评论
为什么被折叠?



