SpringBoot怎么集成Redisson实现延迟队列
发表于:2025-01-30 作者:千家信息网编辑
千家信息网最后更新 2025年01月30日,今天小编给大家分享一下SpringBoot怎么集成Redisson实现延迟队列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文
千家信息网最后更新 2025年01月30日SpringBoot怎么集成Redisson实现延迟队列
今天小编给大家分享一下SpringBoot怎么集成Redisson实现延迟队列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
使用场景
1、下单成功,30分钟未支付。支付超时,自动取消订单
2、订单签收,签收后7天未进行评价。订单超时未评价,系统默认好评
3、下单成功,商家5分钟未接单,订单取消
4、配送超时,推送短信提醒
……
对于延时比较长的场景、实时性不高的场景,我们可以采用任务调度的方式定时轮询处理。如:xxl-job
今天我们采用一种比较简单、轻量级的方式,使用 Redis 的延迟队列来进行处理。当然有更好的解决方案,可根据公司的技术选型和业务体系选择最优方案。如:使用消息中间件Kafka、RabbitMQ 的延迟队列
先不讨论其实现原理,直接实战上代码先实现基于 Redis 的延迟队列
1、引入 Redisson 依赖
org.redisson redisson-spring-boot-starter 3.10.5
2、Nacos 配置 Redis 连接
spring: redis: host: 127.0.0.1 port: 6379 password: 123456 database: 12 timeout: 3000
3、创建 RedissonConfig 配置
/** * Created by LPB on 2020/04/20. */@Configurationpublic class RedissonConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.database}") private int database; @Value("${spring.redis.password}") private String password; @Bean public RedissonClient redissonClient() { Config config = new Config(); config.useSingleServer() .setAddress("redis://" + host + ":" + port) .setDatabase(database) .setPassword(password); return Redisson.create(config); }}
4、封装 Redis 延迟队列工具类
/** * redis延迟队列工具 * Created by LPB on 2021/04/20. */@Slf4j@Componentpublic class RedisDelayQueueUtil { @Autowired private RedissonClient redissonClient; /** * 添加延迟队列 * @param value 队列值 * @param delay 延迟时间 * @param timeUnit 时间单位 * @param queueCode 队列键 * @param*/ public void addDelayQueue(T value, long delay, TimeUnit timeUnit, String queueCode){ try { RBlockingDeque
5、创建延迟队列业务枚举
/** * 延迟队列业务枚举 * Created by LPB on 2021/04/20. */@Getter@NoArgsConstructor@AllArgsConstructorpublic enum RedisDelayQueueEnum { ORDER_PAYMENT_TIMEOUT("ORDER_PAYMENT_TIMEOUT","订单支付超时,自动取消订单", "orderPaymentTimeout"), ORDER_TIMEOUT_NOT_EVALUATED("ORDER_TIMEOUT_NOT_EVALUATED", "订单超时未评价,系统默认好评", "orderTimeoutNotEvaluated"); /** * 延迟队列 Redis Key */ private String code; /** * 中文描述 */ private String name; /** * 延迟队列具体业务实现的 Bean * 可通过 Spring 的上下文获取 */ private String beanId;}
6、定义延迟队列执行器
/** * 延迟队列执行器 * Created by LPB on 2021/04/20. */public interface RedisDelayQueueHandle{ void execute(T t);}
7、创建枚举中定义的Bean,并实现延迟队列执行器
OrderPaymentTimeout:订单支付超时延迟队列处理类
/** * 订单支付超时处理类 * Created by LPB on 2021/04/20. */@Component@Slf4jpublic class OrderPaymentTimeout implements RedisDelayQueueHandle
OrderTimeoutNotEvaluated:订单超时未评价延迟队列处理类
/** * 订单超时未评价处理类 * Created by LPB on 2021/04/20. */@Component@Slf4jpublic class OrderTimeoutNotEvaluated implements RedisDelayQueueHandle
8、创建延迟队列消费线程,项目启动完成后开启
/** * 启动延迟队列 * Created by LPB on 2021/04/20. */@Slf4j@Componentpublic class RedisDelayQueueRunner implements CommandLineRunner { @Autowired private RedisDelayQueueUtil redisDelayQueueUtil; @Override public void run(String... args) { new Thread(() -> { while (true){ try { RedisDelayQueueEnum[] queueEnums = RedisDelayQueueEnum.values(); for (RedisDelayQueueEnum queueEnum : queueEnums) { Object value = redisDelayQueueUtil.getDelayQueue(queueEnum.getCode()); if (value != null) { RedisDelayQueueHandle redisDelayQueueHandle = SpringUtil.getBean(queueEnum.getBeanId()); redisDelayQueueHandle.execute(value); } } } catch (InterruptedException e) { log.error("(Redis延迟队列异常中断) {}", e.getMessage()); } } }).start(); log.info("(Redis延迟队列启动成功)"); }}
以上步骤,Redis 延迟队列核心代码已经完成,下面我们写一个测试接口,用 PostMan 模拟测试一下
9、创建一个测试接口,模拟添加延迟队列
/** * 延迟队列测试 * Created by LPB on 2020/04/20. */@RestControllerpublic class RedisDelayQueueController { @Autowired private RedisDelayQueueUtil redisDelayQueueUtil; @PostMapping("/addQueue") public void addQueue() { Mapmap1 = new HashMap<>(); map1.put("orderId", "100"); map1.put("remark", "订单支付超时,自动取消订单"); Map map2 = new HashMap<>(); map2.put("orderId", "200"); map2.put("remark", "订单超时未评价,系统默认好评"); // 添加订单支付超时,自动取消订单延迟队列。为了测试效果,延迟10秒钟 redisDelayQueueUtil.addDelayQueue(map1, 10, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_PAYMENT_TIMEOUT.getCode()); // 订单超时未评价,系统默认好评。为了测试效果,延迟20秒钟 redisDelayQueueUtil.addDelayQueue(map2, 20, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_TIMEOUT_NOT_EVALUATED.getCode()); }}
10、启动 SpringBoot 项目,用 PostMan 调用接口添加延迟队列
通过 Redis 客户端可看到两个延迟队列已添加成功
查看 IDEA 控制台日志可看到延迟队列已消费成功
以上就是"SpringBoot怎么集成Redisson实现延迟队列"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
队列
延迟
订单
支付
评价
处理
成功
业务
测试
好评
系统
知识
篇文章
场景
接口
时间
消息
执行器
内容
工具
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
去联通软件开发工作怎么样
中小学生网络安全课件
服务器安装web服务器
HCNA网络技术期中试卷
国家网络安全监督管理局
arcserver服务器
中国移动网络技术客服电话
合肥科技互联网公司招聘
socket本机服务器
深信服云桌面服务器系统
网络安全法 信息泄露条款
战地1换服务器
多核网络安全处理器
手游看那些数据库
计算机三级试卷 数据库
德风科技工业互联网
网络安全漏洞预警公告
中金通宝网络技术
2009比特币网络技术
东莞百信网络技术有限公司
网络安全专业博士一般干几年
服务器读写nas文件
计算机三级网络技术好考不
网络安全法20条全文解读
有美国服务器的游戏
软件开发能研发游戏吗
通策收发邮件服务器地址
江苏软件开发配置
武汉互联网科技企业
戴尔如何连接服务器