🎉🎉《Spring Boot实战案例合集》目前已更新132个案例,我们将持续不断的更新。文末有电子书目录。
💪💪永久更新承诺
我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。
💌💌如何获取
订阅我们的合集《点我订阅》,并通过私信联系我们,我们将第一时间将电子书发送给您。
环境:SpringBoot3.4.0
1. 简介
在分布式系统中,定时任务调度是个常见需求。为了学习相关知识,我们尝试自己实现一个简易版的分布式任务调度。核心在于@DistributedScheduled注解,它让我们能像使用Spring的@Scheduled一样,方便地定义任务的执行时间。
这个注解背后,其实有一套分布式锁的机制。我们利用Redis(Redssion),确保同一时间只有一个节点能执行任务。当任务执行时间到,多个节点会尝试获取锁,只有获取成功的节点才会真正执行任务。
通过这种方式,我们实现了分布式环境下的定时任务调度,既保证了任务的精确执行,又避免了资源的浪费和数据的冲突。虽然市面上已有许多成熟的分布式任务调度组件,但自己动手实现,无疑能更深入地理解其背后的原理和机制。
最终效果如下:
cron = "0/5 * * * * ?",group = "ordertest")public class OrderCleanupTask {}
接下来,我们将通过自定义的 @DistributedScheduled 注解实现分布式定时任务(具体定时任务的执行我们还会依赖Spring实现的定时任务机制),同时还会借助Redssion实现分布式锁。
2. 实战案例
2.1 自定义注解
public DistributedScheduled {// Cron表达式String cron() ;// 任务分组String group() default "default" ;}
group属性,该属性将被用作生成分布式锁key的一部分(目前仅限于此用途)。我们特意将该注解设计为仅能应用于类级别,确保每个任务作为一个独立的类存在,这与Spring提供的作用于方法级别的定时任务机制有所不同。
2.2 元数据定义
我们通过record来定义每个注解配置的数据:
public record TaskDetail(String cron, String group, String beanName) {}


