当前位置:
首页
文章
后端
详情

解析SpringBoot框架如何配置ShedLock分布式定时任务

在 Java 中有一个叫做 timer 的定时器,在一定时间反复重复一件事情。那么在当下最流行的微服务框架 SpringBoot 是否也有类似的功能框架呢?答案是有的。下面我将为大家详细介绍关于 SpringBoot 框架中的定时任务框架 ShedLock。

什么是ShedLock

ShedLock是一个在分布式环境中使用的定时任务框架,用于解决在分布式环境中的多个实例的相同定时任务在同一时间点重复执行的问题,解决思路是通过对公用的数据库中的某个表进行记录和加锁,使得同一时间点只有第一个执行定时任务并成功在数据库表中写入相应记录的节点能够成功执行而其他节点直接跳过该任务。当然不只是数据库,目前已经实现的支持数据存储类型除了经典的关系型数据库,还包括MongoDB,Zookeeper,Redis,Hazelcast。

如何使用

ShedLock采用非侵入式编程的思想,通过注解的方式来实现相应的功能。

要使用ShedLock,请执行以下操作

  • 启用并配置计划锁定
  • 注释您的计划任务
  • 配置锁提供程序

1.启用并配置计划锁定

首先,引入依赖

< dependency >
    < groupId > net.javacrumbs.shedlock </ groupId >
    < artifactId > shedlock-spring </ artifactId >
    < version > 2.5.0 </ version >
</ dependency >

现在我们需要将库集成到Spring中。为了启用计划锁定,请使用@EnableSchedulerLock注释

@Configuration 
@EnableScheduling 
@EnableSchedulerLock(defaultLockAtMostFor  =  “ PT30S ”)
 类 MySpringConfiguration {
     ... 
}

注释您的计划任务

import  net.javacrumbs.shedlock.core.SchedulerLock ;
 
...
 
@Scheduled(...)@
 SchedulerLock(name  =  “ scheduledTaskName ”)
 public  void scheduledTask(){
    //做某事 
}

@SchedulerLock注解一共支持五个参数,分别是

name 用来标注一个定时服务的名字,被用于写入数据库作为区分不同服务的标识,如果有多个同名定时任务则同一时间点只有一个执行成功
lockAtMostFor 成功执行任务的节点所能拥有独占锁的最长时间,单位是毫秒ms
lockAtMostForString 成功执行任务的节点所能拥有的独占锁的最长时间的字符串表达,例如“PT14M”表示为14分钟
lockAtLeastFor 成功执行任务的节点所能拥有独占所的最短时间,单位是毫秒ms
lockAtLeastForString 成功执行任务的节点所能拥有的独占锁的最短时间的字符串表达,例如“PT14M”表示为14分钟

与Spring进行整合,ShedLock支持两种Spring集成模式。

TaskScheduler代理

需要配置两个Bean,一个是lockProvider,一个是scheduler

默认情况下,ShedLock在Spring周围创建AOP代理TaskScheduler。如果未指定任务计划程序,则会为您创建默认任务计划程序。如果您有特殊需求,只需创建一个bean实现TaskScheduler接口,它将自动包装到AOP代理中。

由于ShedLock使用Mongo,JDBC数据库,Redis,Hazelcast,ZooKeeper等外部存储进行协调。所以我选择的是redis。

<dependency>
    <groupId> net.javacrumbs.shedlock </ groupId >
    <artifactId > shedlock-provider-redis-spring </ artifactId >
    <version> 2.5.0 </version>
</dependency >
 
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
  </dependency>
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT5M")
public class ShedLockConfig {
 
 
    @Bean
    public LockProvider lockProvider(RedisTemplate redisTemplate){
        return new RedisLockProvider(redisTemplate.getConnectionFactory());
        
    }
    @Bean 
    public  TaskScheduler taskScheduler(){
     return  new  MySpecialTask​​Scheduler();
    }
    
}

预定方法代理

如果你有更多特殊需求,可以像这样使用Scheduled Method代理

@EnableSchedulerLock(mode  =  PROXY_METHOD,defaultLockAtMostFor  =  “ PT30S ”)

如果PROXY_METHOD选择了mode,则ShedLock会在每个带@SchedulerLock注释的方法周围创建AOP代理。这种方法的主要优点是它不依赖于Spring调度。缺点是即使您直接调用该方法也会应用锁定。还要注意,目前仅支持void返回方法,如果您注释并调用具有非void返回类型的方法,则会引发异常。

到此本篇关于 SpringBoot 配置 ShedLock 分布式定时任务的文章就介绍到这了,想要了解更多相关 SpringBoot ShedLock分布式定时任务的其他内容请搜索W3Cschool以前的文章或继续浏览下面的相关文章,希望大家以后多多支持我们!


免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。

同类热门文章

深入了解C++中的new操作符:使用具体实例学习

C++中的new操作符是动态分配内存的主要手段之一。在程序运行时,我们可能需要动态地创建和销毁对象,而new就是为此提供了便利。但是,使用new也常常会引发一些问题,如内存泄漏、空指针等等。因此,本文将通过具体的示例,深入介绍C++中的new操作符,帮助读者更好地掌握其使用。


深入了解C++中的new操作符:使用具体实例学习

怎么用Java反射获取包下所有类? 详细代码实例操作

Java的反射机制就是在运行状态下,对于任何一个类,它能知道这个类的所有属性和方法;对于任何一个对象,都能调用这个对象的任意一个方法。本篇文章将通过具体的代码示例,展示如何通过Java反射来获取包下的所有类。


怎么用Java反射获取包下所有类? 详细代码实例操作

了解Java中的volati关键字的作用 以及具体使用方法

本篇文章将和大家分享一下Java当中的volatile关键字,下面将为各位小伙伴讲述volatile关键字的作用以及它的具体使用方法。


了解Java中的volati关键字的作用 以及具体使用方法

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型: 上面的代码会将 map 中所有的值都转为 String 类型。 HashMap 是 Java

Java Map 所有的值转为String类型

员工线上学习考试系统

有点播,直播,在线支付,三级分销等功能,可以对学员学习情况的监督监控,有源码,可二次开发。支持外网和局域网私有化部署,经过测试源码完整可用!1、视频点播:视频播放,图文资料,课件下载,章节试学,限时免

员工线上学习考试系统