# tasks **Repository Path**: yin_huidong/task ## Basic Information - **Project Name**: tasks - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-07-02 - **Last Updated**: 2021-07-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 分布式锁@Shedlock解决集群定时任务问题@Scheduled Shedlock是个分布式锁,大致实现,就是针对多个服务,提供一个公有的存储,来维护这个锁(类似悲观锁机制)。 因为使用数据库维护锁,写比较耗时,所以只适合粗粒度的定时任务,对于比较细粒度的定时任务,比如秒级、毫秒级等等,不适合,适用于当前业务场景。 ![](https://images1.freesion.com/172/c3/c39204cdcfb720868db2ea942aa859ec.png) 因为拿不到就跳过本次执行这个策略,所以非常适定时任务(实际上就是为定时任务设计的)。 ## 1.使用 建表,表名默认用这个`shedlock`,改其它的需要额外配置,字段也是固定的,使用时候只需要建好这个表就可以了,不需要额外操作。 ```sql CREATE TABLE `shedlock` ( `name` varchar(64) COLLATE utf8_bin NOT NULL, `lock_until` timestamp(3) NULL DEFAULT NULL, `locked_at` timestamp(3) NULL DEFAULT NULL, `locked_by` varchar(255) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; ``` ## 2.代码 https://gitee.com/yin_huidong/task.git ## 3.补充 SchedulerLock 参数 @SchedulerLock 将所需要加锁的方法加上此锁,还必须指定锁的名称。同时在一个时间内只能执行一个任务。 name 分布式锁名称,锁名称必须是唯一的。 lockAtMostFor & lockAtMostForString 指定在执行节点死亡时应将锁保留多长时间。这只是一个备用选项,在正常情况下,任务完成后立即释放锁定。 使用时必须将其设置lockAtMostFor为比正常执行时间长得多的值。如果任务花费的时间超过 lockAtMostFor了所导致的行为,则可能无法预测(更多的进程将有效地持有该锁)。 lockAtMostFor 单位 毫秒 lockAtMostForString 使用“ PT14M” 意味着它将被锁定不超过14分钟。 lockAtLeastFor & lockAtLeastForString 该属性指应保留锁定的最短时间。其主要目的是在任务很短且节点之间的时钟差的情况下,防止从多个节点执行。 例:假设有一个任务,每10分钟执行一次,通常需要花费几分钟才能运行。此外,您希望每15分钟最多执行一次。在这种情况下,可以像这样配置 ```java @Scheduled(fixedDelay = 1000*60*10) @SchedulerLock(name = "queryRechargeBill", lockAtMostFor = 1000*60*15, lockAtLeastFor = 1000*60*5) public void queryRechargeBill(){ // do something } ``` 该锁将持有5分钟,5分钟释放,当节点异常或者死亡,该锁默认在15分钟后自动释放。在正常情况下,ShedLock在任务完成后立即释放锁定。实际上,我们不必这样做,因为@EnableSchedulerLock中提供了默认值, 但我们选择在此处覆盖它。 1. cron是设置定时执行的表达式,如 0 0/5 * * * ?每隔五分钟执行一次 2. zone表示执行时间的时区 3. fixedDelay 和fixedDelayString 一个固定延迟时间执行,上个任务完成后,延迟多久执行 4. fixedRate 和fixedRateString一个固定频率执行,上个任务开始后多长时间后开始执行 5. initialDelay 和initialDelayString表示一个初始延迟时间,第一次被调用前延迟的时间 ## 亮点在哪里? 当一个外部系统需要使用任务调度的时候, 仅仅需要提供给任务系统一个接口访问路径,与任务执行规则,就可以动态生成定时任务。 实现原理: 1. 当接收到添加任务的请求,后台自动通过编译一个唯一的,新的字节码文件的方式生成class文件, 2. 通过类加载起加载到jvm生成Class实例 3. 在运行时动态将Class实例的对象添加到spring容器 4. 由spring来管理定时任务 5. 通过持久化的到数据库的方式,防止配置好的任务丢失,并且可以自由控制任务的启动和停止。 6. 服务down机重启后,会自动扫描数据库表,加载所有任务类交给spring容器管理