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分布式定时任务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot与Quartz集成实现分布式定时任务集群的代码实例

    Spring Boot与Quartz集成实现分布式定时任务集群 直接贴代码 POM <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs

  • Springboot非分布式定时任务实现代码

    1. 核心注解 在springboot项目中我们可以很方便地使用spring自己的注解@Scheduled和@EnableScheduling配合来实现便捷开发定时任务. @EnableScheduling注解的作用是发现注解@Scheduled的任务并后台执行,此注解可以加到启动类上也可以加到执行调度任务类上. 经测试,当有多个包含定时任务的类时,@EnableScheduling注解加在其中一个类上就可以保证所有定时任务的成功实现. 注意:定时任务的类上还需要配合使用@Configurati

  • SpringBoot配置ShedLock分布式定时任务

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

  • SpringBoot 集成 ShedLock 分布式锁的示例详解

    目录 一:ShedLock 简介 二:配置maven 依赖 三:SchedulerLock 基于 Redis 的配置 四:在启动类中添加 @EnableScheduling 标签 五:test 测试案例 一:ShedLock 简介 ShedLock是一个在分布式环境中使用的定时任务框架,用于解决在分布式环境中的多个实例的相同定时任务在同一时间点重复执行的问题.ShedLock确保计划的任务最多同时执行一次.如果一个任务正在一个节点上执行,它会获得一个锁,该锁将阻止从另一个节点(或线程)执行同一任

  • Spring Boot集成ShedLock分布式定时任务的实现示例

    一.ShedLock是什么? 官方地址:github.com/lukas-kreca- 以下是ShedLock锁提供者,通过外部存储实现锁,由下图可知外部存储集成的库还是很丰富的 本篇教程我们基于JdbcTemplate存储为例来使用ShedLock锁. 二.落地实现 1.1 引入依赖包 shedlock所需依赖包: <dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>she

  • Java中实现分布式定时任务的方法

    定时器Scheduler在平时使用比较频繁,在springboot中,配置好@Scheduled和@EnableScheduling之后,定时器就能正常执行,实现定时任务的功能. 但是在这样的情况下:如果开发的服务需要水平部署实现负载均衡,那么定时任务就会同时在多个服务实例上运行,那么一方面,可能由于定时任务的逻辑处理需要访问公共资源从而造成并发问题:另一方面,就算没有并发问题,那么一个同样的任务多个服务实例同时执行,也会造成资源的浪费.因此需要一种机制来保证多个服务实例之间的定时任务正常.合理

  • springboot+redis 实现分布式限流令牌桶的示例代码

    1.前言 网上找了很多redis分布式限流方案,要不就是太大,需要引入第三方jar,而且还无法正常运行,要不就是定时任务定时往key中放入数据,使用的时候调用,严重影响性能,所以着手自定义实现redis令牌桶. 只用到了spring-boot-starter-data-redis包,并且就几行代码. 2.环境准备 a.idea新建springboot项目,引入spring-data-redis包 b.编写令牌桶实现方法RedisLimitExcutor c.测试功能,创建全局拦截器,测试功能 3

  • SpringBoot整合Xxl-job实现定时任务的全过程

    目录 前言 一.部署调度中心 1.项目下载 2.初始化数据 3.修改properties配置文件 二.部署SpringBoot项目 1.引入依赖 2.创建配置类 3.修改配置文件 4.创建执行器 5.启动SpringBoot项目 三.通过调度中心进行任务调度 1.添加执行器 2.添加任务 3.任务调度中心发起任务调度 四.小结 总结 前言 ​ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 如果是单机

  • SpringBoot集成quartz实现定时任务详解

    目录 准备知识点 什么是Quartz Quartz的体系结构 什么是Quartz持久化 实现案例 - 单实例方式 实现案例 - 分布式方式 后端实现 前端实现 测试效果 准备知识点 需要了解常用的Quartz框架. 什么是Quartz 来源百度百科, 官网地址:http://www.quartz-scheduler.org/ Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来

  • SpringBoot+Quartz实现动态定时任务

    本文实例为大家分享了springBoot+Quartz实现动态定时任务的具体代码,供大家参考,具体内容如下 目前常用的几种任务调度 Timer,简单无门槛,一般也没人用. spring @Scheduled注解,一般集成于项目中,小任务很方便. 开源工具 Quartz,分布式集群开源工具,以下两个分布式任务应该都是基于Quartz实现的,可以说是中小型公司必选,当然也视自身需求而定. 分布式任务 XXL-JOB,是一个轻量级分布式任务调度框架,支持通过 Web 页面对任务进行 CRUD 操作,支

  • 基于spring+quartz的分布式定时任务框架实现

    问题背景 我公司是一个快速发展的创业公司,目前有200人,主要业务是旅游和酒店相关的,应用迭代更新周期比较快,因此,开发人员花费了更多的时间去更=跟上迭代的步伐,而缺乏了对整个系统的把控 没有集群之前,公司定时任务的实现方式 在初期应用的访问量并不是那么大,一台服务器完全满足使用,应用中有很多定时任务需要执行 有了集群之后,公司定时任务实现的方式 随着用户的增加,访问量也就随之增加,一台服务器满足不了高并发的要求,因此公司把应用给部署到集群中,前端通过nginx代理(应用服务器ip可能是用防火墙

  • Springboot通过Scheduled实现定时任务代码

    定时任务一般会存在中大型企业级项目中,为了减少服务器.数据库的压力往往会采用时间段性的去完成某些业务逻辑.比较常见的就是金融服务系统推送回调,一般支付系统订单在没有收到成功的回调返回内容时会持续性的回调,这种回调一般都是定时任务来完成的.还有就是报表的生成,我们一般会在客户访问量过小的时候来完成这个操作,那往往都是在凌晨.这时我们也可以采用定时任务来完成逻辑.SpringBoot为我们内置了定时任务,我们只需要一个注解就可以开启定时为我们所用了. 在开发中,定时任务是常见的功能,在spring

随机推荐