SpringBoot怎么集成Redisson实现延迟队列
发表于:2025-02-16 作者:千家信息网编辑
千家信息网最后更新 2025年02月16日,今天小编给大家分享一下SpringBoot怎么集成Redisson实现延迟队列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文
千家信息网最后更新 2025年02月16日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安全错误
数据库的锁怎样保障安全
索尼mp3正在更新数据库
国际版王者服务器无响应
专家数据库系统制作
如何维护网络安全正能量申论
湖北嵌入式软件开发哪家正规
服务器上的数据库
利用网络软件开发
网络安全大会8月
嘉定区网络技术服务市场报价
贵州省网络安全管理民警
liunx卸载数据库
阿里云服务器下载目录
数据库密码输错多少次
网络安全综述最新版本图书
数据库删除语句含有
淘宝互联网科技有限公司
武汉智能建模软件开发
搭建私人服务器
管理售后服务器
只读域控制器是服务器吗
马桶c的起床战争服务器
网络安全我先行活动课教案
esc服务器上不了网
电信采购服务器芯片
数据库反映很慢
互联网医疗科技创新项目
事业单位十四五网络安全发展规划
腾讯云数据库安全组放行
南京市软件开发合同免税备案
合川三汇网络安全