精华内容
下载资源
问答
  • SpringBoot2.x整合轻量级分布式定时任务ShedLock的使用详解 一、关于ShedLock ShedLock采用非侵入式编程的思想,通过注解的方式来实现相应的功能。ShedLock是一个在分布式环境中使用的定时任务框架,用于解决在...

    SpringBoot2.x整合轻量级分布式定时任务ShedLock的使用详解

    一、关于ShedLock

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

    详细集成步骤

    1. 在pom.xml中新增引入Spring整合ShedLock依赖包(基于JDBC来提供锁)
      <!--分布式定时任务锁-->
            <dependency>
                <groupId>net.javacrumbs.shedlock</groupId>
                <artifactId>shedlock-spring</artifactId>
                <version>2.2.1</version>
            </dependency>
    
            <dependency>
                <groupId>net.javacrumbs.shedlock</groupId>
                <artifactId>shedlock-provider-jdbc-template</artifactId>
                <version>2.2.1</version>
            </dependency>
    
    1. 建表
    DROP TABLE IF EXISTS `shedlock`;
    
    CREATE TABLE `shedlock` (
      `name` varchar(64) NOT NULL COMMENT '锁名称(name必须是主键',
      `lock_until` timestamp(3) NULL DEFAULT NULL COMMENT '释放锁时间',
      `locked_at` timestamp(3) NULL DEFAULT NULL COMMENT '获取锁时间',
      `locked_by` varchar(255) DEFAULT NULL COMMENT '锁提供者',
      PRIMARY KEY (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    1. 配置LockProvider,这儿以JDBC为实现的
     import net.javacrumbs.shedlock.core.LockProvider;
    import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
    import net.javacrumbs.shedlock.spring.ScheduledLockConfiguration;
    import net.javacrumbs.shedlock.spring.ScheduledLockConfigurationBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import javax.sql.DataSource;
    import java.time.Duration;
    
    @Configuration
    @EnableScheduling
    public class ShedlockConfig {
    
    	@Bean
        public LockProvider lockProvider(DataSource dataSource) {
            return new JdbcTemplateLockProvider(dataSource);
        }
     
        @Bean
        public ScheduledLockConfiguration scheduledLockConfiguration(LockProvider lockProvider) {
            return ScheduledLockConfigurationBuilder
                    .withLockProvider(lockProvider)
                    .withPoolSize(10)
                    .withDefaultLockAtMostFor(Duration.ofMinutes(10))
                    .build();
        }
    }
    
    1. 在项目的启动类中新增 “ @EnableSchedulerLock ” 注解,开启ShedLock
     import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletComponentScan;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    
    @EnableAsync
    @SpringBootApplication
    @RefreshScope
    @EnableDiscoveryClient
    @EnableTransactionManagement
    @EnableScheduling
    @ServletComponentScan
    @EnableSchedulerLock(defaultLockAtMostFor = "PT20M", defaultLockAtLeastFor = "PT20M")
    @MapperScan(value={"com.nari.platform.mapper"})
    public class NariPlatform {
    
    	public static void main(String[] args) {
    		SpringApplication.run(NariPlatform.class, args);
    	}
    	
    
    }
    
    1. 在需要加锁的Scheduled任务上添加注解 @SchedulerLock
     @Configuration
    @EnableScheduling
    @Slf4j
    public class CalcDeviceDataTask {
    
    
        @Scheduled(cron = "0 11 06 * * ?")
        @SchedulerLock(name = "configureTasks", lockAtLeastFor = 120000, lockAtMostFor = 18000)
        public void configureTasks() {
            try{
                log.info("开始执行定时任务"+System.currentTimeMillis());
            } catch (Exception e){
    
                log.info("定时任务执行失败"+e.getMessage());
            }
    
        }
    }
    

    参数说明:

    @SchedulerLock 作用:只有某个方法上添加了该注解的方法才会被锁定,该库将忽略所有其他计划任务。且必须为锁指定名称,这样才能在同一时间只能有一个具有相同名称的任务执行,以达到预期的锁的目的。

    参数类型描述
    nameString用来标注一个定时服务的名字,被用于写入数据库作为区分不同服务的标识,如果有多个同名定时任务则同一时间点只有一个执行成功。默认为:""
    lockAtMostFor$12成功执行任务的节点所能拥有独占锁的最长时间,单位是毫秒ms。默认值为:-1L,表示不生效,当设置为正整数时才生效。该属性主要指定在执行节点死亡的情况下锁应该保持多长时间。这只是一个应变的计划,在正常情况下,锁会在任务完成时释放,即使节点死亡,过了设定的该时间值也会被释放,避免死锁的情况发生。但是必须将lockAtMostFor设置为一个比正常执行时间长得多的值,具体的多少,这个就需要根据自身对任务的判断了。如果任务花费的时间与lockAtMostFor时间相比,结果可能是不可预测的(尤其当多个进程将有效地持有锁时)。
    lockAtMostForStringString成功执行任务的节点所能拥有的独占锁的最长时间的字符串表达式。例如:“PT30S”,表示30秒;“PT10M”,表示14分钟。
    lockAtLeastForlong成功执行任务的节点所能拥有独占所的最短时间,单位是毫秒ms。默认值为:-1L,表示不生效,当设置为正整数时才生效,lockAtLeastFor属性指定应该保留锁的最小时间值,它的主要目的是为了解决多个节点执行时任务执行时间短,节点和节点之间的时间差异问题(例如:A节点的时间为18:00,B节点的时间为18:08,此时的时间差为8分钟,所以这个时候就因为指定lockAtLeastFor>=8M,确保相同的任务在这个时段内只执行一次,不会超过一次)。
    lockAtLeastForStringString成功执行任务的节点所能拥有的独占锁的最短时间的字符串表达式。例如:“PT30S”,表示30秒;“PT10M”,表示14分钟。

    @EnableSchedulerLock 作用:开启ShedLock的支持

    interceptMode默认为:PROXY_METHOD
    defaultLockAtMostFor成功执行任务的节点所能拥有的独占锁的最长时间的字符串表达,例如“PT30S”表示为30秒
    defaultLockAtLeastFor成功执行任务的节点所能拥有的独占锁的最短时间的字符串表达,例如“PT30S”表示为30秒,默认为:“PT0S”
    导mode默认为:AdviceMode.PROXY
    proxyTargetClass默认为:false
    展开全文
  • SpringBoot2.x整合轻量级分布式定时任务ShedLock3.x的使用详解 一、关于ShedLock 二、ShedLock的三个核心组件 三、ShedLock使用三步走 四、SpringBoot集成ShedLock(基于JDBC来提供锁) 五、Spring 集成 ...

     

    目录

    前言

    SpringBoot2.x整合轻量级分布式定时任务ShedLock3.x的使用详解

    一、关于ShedLock

    二、ShedLock的三个核心组件

    三、ShedLock使用三步走

    四、SpringBoot集成ShedLock(基于JDBC来提供锁)

    五、Spring 集成 ShedLock的两种模式


    前言

    前段时间,根据项目要求,需要实现微服务的高可用,即,将某个服务部署多个实例,但是其中涉及到了很多定时任务调度的问题(。。。其他废话不多说),思来想去,暂定使用了 ShedLock 来实现分布式定时任务锁,本篇主要介绍了SpringBoot2.x整合轻量级分布式定时任务ShedLock3.x的使用详解。

     

    SpringBoot2.x整合轻量级分布式定时任务ShedLock3.x的使用详解

    一、关于ShedLock

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

     

    二、ShedLock的三个核心组件

        Core - 锁机制
        Integration - 通过Spring AOP、Micronaut AOP或者手写代码进行与应用程序的集成
        Lock provider - 使用关系型数据库(RDBMS),非关系型数据库:Mongo、Redis等外部进程来提供锁

     

    三、ShedLock使用三步走

        1)、启用并配置Scheduled的锁
        2)、在Scheduled任务上面添加注解
        3)、配置锁的提供者(JDBC、Redis、Mongo等)

     

    四、SpringBoot集成ShedLock(基于JDBC来提供锁)

    1)、在pom.xml中新增引入Spring整合ShedLock依赖包

    <dependency>
    	<groupId>net.javacrumbs.shedlock</groupId>
    	<artifactId>shedlock-spring</artifactId>
    	<version>3.0.1</version>
    </dependency>
    <dependency>
    	<groupId>net.javacrumbs.shedlock</groupId>
    	<artifactId>shedlock-provider-jdbc-template</artifactId>
    	<version>3.0.1</version>
    </dependency>

     

    2)、配置LockProvider,这里使用的JDBC,所以需要配置JDBC的LockProvider,在每个实例对应的数据库中新建锁表-shedlock表(请注意名称须是主键)建表语句如下:

    CREATE TABLE shedlock(
        name VARCHAR(64), 
        lock_until TIMESTAMP(3) NULL, 
        locked_at TIMESTAMP(3) NULL, 
        locked_by VARCHAR(255), 
        PRIMARY KEY (name)
    );
    COMMENT ON COLUMN "shedlock"."name" IS '锁名称(name必须是主键)';
    COMMENT ON COLUMN "shedlock"."lock_until" IS '释放锁时间';
    COMMENT ON COLUMN "shedlock"."locked_at" IS '获取锁时间';
    COMMENT ON COLUMN "shedlock"."locked_by" IS '锁提供者';

    *注意:基于关系型数据库(RDBMS)的形式的外部存储必须创建表结构,而非关系型,例如:Redis等非关系型数据库形式的外部存储,template会根据注解 @SchedulerLock 声明的锁名称自动创建对应的键值对,以此来提供锁的实现。

     

    3)、配置LockProvider,关于LockProvider有几种配置实现,这儿以JDBC为实现的,

    package com.huazai.aiyou.common.config;
    
    import net.javacrumbs.shedlock.core.LockProvider;
    import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    
    /**
     * 
     * @author HuaZai
     * @contact who.seek.me@java98k.vip
     *          <ul>
     * @description 配置 LockProvider
     *              </ul>
     * @className ShedlockConfig
     * @package com.huazai.aiyou.common.config
     * @createdTime 2019年03月20日
     *
     * @version V1.0.0
     */
    @Configuration
    public class ShedlockConfig
    {
    
    	@Bean
    	public LockProvider lockProvider(DataSource dataSource)
    	{
    		return new JdbcTemplateLockProvider(dataSource);
    	}
    }
    

    当然还有更细粒度的配置,通过 Configuration 对象来实现,可以自己去尝试一下,内容如下:

    new JdbcTemplateLockProvider(builder()
        .withTableName("shdlck")
        .withColumnNames(new ColumnNames("n", "lck_untl", "lckd_at", "lckd_by"))
        .withJdbcTemplate(new JdbcTemplate(getDatasource()))
        .withLockedByValue("my-value")
        .build())

    *注意:在ShedLock使用的过程中,千万不要从数据库表中手动删除锁行或文档。ShedLock有一个现有锁的内存缓存,因此在应用程序重新启动之前不会自动重新创建该行。如果需要,您可以编辑行或文档,这样做的风险是只持有多个锁。在1.0.0可以通过调用LockProvider上的clearCache()方法来清除缓存。

     

    4)、在项目的启动类中新增 “ @EnableSchedulerLock ” 注解,开启ShedLock

    package com.huazai.aiyou.controller;
    
    import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.hystrix.EnableHystrix;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    /**
     * 
     * @author HuaZai
     * @contact who.seek.me@java98k.vip
     *          <ul>
     * @description 门户网站Web端启动类
     *              </ul>
     * @className AiyouApplication
     * @package com.huazai.aiyou
     * @createdTime 2019年03月20日
     *
     * @version V1.0.0
     */
    @EnableHystrix
    @EnableCaching
    @EnableDiscoveryClient
    @EnableFeignClients
    @EnableEurekaClient
    @EnableCircuitBreaker
    @EnableAutoConfiguration
    @EnableScheduling
    @EnableSchedulerLock(defaultLockAtMostFor = "PT20M", defaultLockAtLeastFor = "PT20M")
    public class AiyouApplication
    {
    
    	public static void main(String[] args)
    	{
    		SpringApplication.run(AiyouApplication.class, args);
    	}
    }
    

     

    5)、在需要加锁的Scheduled任务上添加注解 “ @SchedulerLock

    package com.huazai.aiyou.controller.task.schedu;
    
    import com.alibaba.fastjson.JSONObject;
    import lombok.extern.slf4j.Slf4j;
    import net.javacrumbs.shedlock.core.SchedulerLock;
    import org.apache.commons.collections4.CollectionUtils;
    import org.apache.commons.collections4.MapUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 
     * @author HuaZai
     * @contact who.seek.me@java98k.vip
     *          <ul>
     * @description TODO
     *              </ul>
     * @className TaskSchedulerController
     * @package com.huazai.aiyou
     * @createdTime 2019年03月20日
     *
     * @version V1.0.0
     */
    @RestController
    @Slf4j
    public class TaskSchedulerController extends BaseController
    {
    
    	// TODO
    
    	/**
    	 * 
    	 * @author HuaZai
    	 * @contact who.seek.me@java98k.vip
    	 * @title sendItemInfoMessage
    	 *        <ul>
    	 * @description TODO
    	 *              </ul>
    	 * @createdTime 2019年03月20日
    	 * @throws GlobalException
    	 * @return void
    	 *
    	 * @version : V1.0.0
    	 */
    	@Scheduled(cron = "0 0 0 * * ?")
    	@SchedulerLock(name = "sendItemInfoMessage")
    	public void sendItemInfoMessage() throws GlobalException
    	{
    		try
    		{
    			// TODO
    		} catch (Exception e)
    		{
    			throw new GlobalException(ExceptionCode.global.ITEM_FAIL, ParamContext.NONE_ITEM_INFO);
    		}
    	}
    
    }
    

     

    参数说明:

    @SchedulerLock 作用:只有某个方法上添加了该注解的方法才会被锁定,该库将忽略所有其他计划任务。且必须为锁指定名称,这样才能在同一时间只能有一个具有相同名称的任务执行,以达到预期的锁的目的。

    参数类型描述
    name            String              用来标注一个定时服务的名字,被用于写入数据库作为区分不同服务的标识,如果有多个同名定时任务则同一时间点只有一个执行成功。默认为:""
    lockAtMostFor             long

    成功执行任务的节点所能拥有独占锁的最长时间,单位是毫秒ms。默认值为:-1L,表示不生效,当设置为正整数时才生效。

    该属性主要指定在执行节点死亡的情况下锁应该保持多长时间。这只是一个应变的计划,在正常情况下,锁会在任务完成时释放,即使节点死亡,过了设定的该时间值也会被释放,避免死锁的情况发生。但是必须将lockAtMostFor设置为一个比正常执行时间长得多的值,具体的多少,这个就需要根据自身对任务的判断了。如果任务花费的时间与lockAtMostFor时间相比,结果可能是不可预测的(尤其当多个进程将有效地持有锁时)。

    lockAtMostForStringString成功执行任务的节点所能拥有的独占锁的最长时间的字符串表达式。例如:"PT30S",表示30秒;"PT10M",表示14分钟。
    lockAtLeastForlong

    成功执行任务的节点所能拥有独占所的最短时间,单位是毫秒ms。默认值为:-1L,表示不生效,当设置为正整数时才生效。

    lockAtLeastFor属性指定应该保留锁的最小时间值,它的主要目的是为了解决多个节点执行时任务执行时间短,节点和节点之间的时间差异问题(例如:A节点的时间为18:00,B节点的时间为18:08,此时的时间差为8分钟,所以这个时候就因为指定lockAtLeastFor>=8M,确保相同的任务在这个时段内只执行一次,不会超过一次)。

    lockAtLeastForStringString成功执行任务的节点所能拥有的独占锁的最短时间的字符串表达式。例如:"PT30S",表示30秒;"PT10M",表示14分钟。

     

    @EnableSchedulerLock 作用:开启ShedLock的支持

    interceptMode默认为:EnableSchedulerLock.InterceptMode.PROXY_METHOD
    defaultLockAtMostFor              成功执行任务的节点所能拥有的独占锁的最长时间的字符串表达,例如“PT30S”表示为30秒
    defaultLockAtLeastFor成功执行任务的节点所能拥有的独占锁的最短时间的字符串表达,例如“PT30S”表示为30秒,默认为:"PT0S"
    mode默认为:AdviceMode.PROXY
    proxyTargetClass默认为:false

     

    *注意:通过设置lockAtMostFor,我们可以确保即使该节点死亡,锁也会被正常释放;通过设置lockAtLeastFor,我们可以确保它在指定的时间内不会执行超过一次。请注意,对于执行任务的节点死亡的情况,lockAtMostFor只是能确保节点执行的一个安全范围,所以在设置这个时间时,这个时间需要远远大于最大评估任务的执行时间。如果任务执行花费的时间比设置的lockAtMostFor更长,那么它可能会再次执行,以至于出现同一个任务重复执行的情况,结果将是不可预测的(导致更多的进程持有锁)。

     

    五、Spring 集成 ShedLock的两种模式

    ShedLock支持两种Spring集成模式。一个是使用关于调度方法的AOP代理(PROXY_METHOD),另一个是代理任务调度器(PROXY_SCHEDULER),如下图:

     

    关于ShedLock的集成模式,一般情况下都是使用的默认值,了解一下就可以,这儿就不再写了,如果有兴趣的小伙伴可以去官网查看。

     

     

     

    参考文献:

    ShedLock GitHub 相关文档:https://github.com/lukas-krecan/ShedLock


     好了,关于 SpringBoot2.x整合轻量级分布式定时任务ShedLock3.x的使用详解 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
    歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


    作       者:华    仔
    联系作者:who.seek.me@java98k.vip
    来        源:CSDN (Chinese Software Developer Network)
    原        文:https://blog.csdn.net/Hello_World_QWP/article/details/103710853
    版权声明:本文为博主原创文章,请在转载时务必注明博文出处!

     

    展开全文
  • ShedLock是一个在分布式环境中使用的定时任务框架,用于解决在分布式环境中的多个实例的相同定时任务在同一时间点重复执行的问题,解决思路是通过对公用的数据库中的某个表进行记录和加锁,使得同一时间点只有第一个...

    什么是ShedLock

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

    如何使用

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

    首先引入Maven依赖

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

    然后使用@SchedulerLock来对需要定时执行的任务进行注解。

    import net.javacrumbs.shedlock.core.SchedulerLock;
    
    ...
    
    @Scheduled(...)
    @SchedulerLock(name = "scheduledTaskName")
    public void scheduledTask() {
       // do something
    }
    

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

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

    与Spring进行整合

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

    <!-- lock provider of your choice (jdbc/zookeeper/mongo/whatever) -->
    <bean id="lockProvider" class="net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider">
        <constructor-arg ref="dataSource"/>
    </bean>
    
    <bean id="scheduler" class="net.javacrumbs.shedlock.spring.SpringLockableTaskSchedulerFactoryBean">
        <constructor-arg>
            <task:scheduler id="sch" pool-size="10"/>
        </constructor-arg>
        <constructor-arg ref="lockProvider"/>
        <constructor-arg name="defaultLockAtMostFor">
            <bean class="java.time.Duration" factory-method="ofMinutes">
                <constructor-arg value="10"/>
            </bean>
        </constructor-arg>
    </bean>
    

    由于ShedLock使用了数据库,所以还需要在数据库中建立一张相应的表以供分布式环境中的各个节点进行加锁解锁。

    与其他数据存储的整合详见作者的github

    原理分析

    ShedLock使用AOP代理的方式来实现。

    可以通过对TaskScheduler类的继承来实现使用者自定义的AOP行为。对于加了@SchedulerLock的方法都会在启动时通过代理的方式加入框架所实现的分布式锁功能。

    image

    @Bean
    public TaskScheduler taskScheduler() {
        return new MySpecialTaskScheduler();
    }
    

    对比quartz

    相比于quartz,ShedLock只提供了最基本的时间调度格式,而quartz可以提供更加丰富的可供自定义的时间调度方式,但是于quartz相比,ShedLock是轻量级的,通过注解的方式,把所有的一切都交给框架处理,使得代码不会受到影响,更加符合非侵入式编程的思想,使得代码更加简洁明了。

    展开全文
  • MSCode微服务平台基于Spring Cloud、Spring Boot、Activiti7工作流和阿里巴巴组件,提供分布式版本和单体式版本以及代码生成器的所有源码和详尽文档,适配电脑、平板和手机,快速开发办公(OA)、电商、金融、财务、...

    MSCode微服务平台基于Spring Cloud、Spring Boot、Activiti7工作流和阿里巴巴组件,提供分布式版本和单体式版本以及代码生成器的所有源码和详尽文档,适配电脑、平板和手机,快速开发办公(OA)、电商、金融、财务、教育、医疗、信息管理(MIS)、客户关系(CRM)和企业资源计划(ERP)等业务系统。我公司提供二次开发技术支持,传授微服务分布式知识。

    MSCode微服务平台框架官网地址 https://www.mscodecloud.com

    MSCode微服务平台框架官网地址 https://www.mscodecloud.com

    展开全文
  • Timer ScheduledExecutorService Quartz Spring Task JCronTab XXL-JOB ...https://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/ https://www.cnblogs.com/aishangJava/p/7587020.html ...
  • 上篇博客,使用xxl-job分布式定时任务框架简单实现了一个demo实例,而java实现分布式定时任务远不止这一个框架,所以,本篇博客的主要内容是将java的几个分布式定时任务框架做个对比总结。 【框架列举】 单机 timer...
  • [size=x-large]LTS 轻量级分布式任务调度框架(Light Task Scheduler)[/size] ----------------- [size=medium]框架概况:[/size] LTS是一个轻量级分布式任务调度框架。有三种角色, JobClient, JobTracker, ...
  • 轻量级分布式任务调度平台 XXL-JOB

    千次阅读 2018-10-30 10:41:26
    From:https://www.cnblogs.com/xuxueli/p/5021979.html github 地址 及 中文文档...     《分布式任务调度平台XXL-JOB》 ...XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量...
  • XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 1.2 特性 1、简单:支持通过Web页面对任务进行CRUD操作,...
  • 分布式定时任务对比

    万次阅读 多人点赞 2018-03-07 14:42:26
    1. 什么是分布式定时任务 把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案  elastic-job , xxl-job ,quartz ,...
  • 分布式定时任务

    2020-05-11 22:53:41
    Elastic-Job-Lite是一种轻量级的分散式解决方案,可提供分布式任务分片服务。Elastic-Job-Cloud是一个Mesos框架,它提供其他资源管理,App分发,进程隔离和任务聚合功能。 优点: 基于quartz 定时任务框架为基础的,...
  • 框架概况:LTS是一个轻量级分布式任务调度框架。有三种角色, JobClient, JobTracker, TaskTracker。各个节点都是无状态的,可以部署多个,来实现负载均衡,实现更大的负载量, 并且框架具有很好的容错能力。 采用多种...
  • LTS(light-task-scheduler)主要用于解决分布式任务调度问题,支持实时任务,定时任务和Cron任务。有较好的伸缩性,扩展性,健壮稳定性而被多家公司使用,同时也希望开源爱好者一起贡献。 项目地址 g...
  • 分布式定时任务解决方案

    千次阅读 2019-11-06 21:06:45
    分布式定时任务解决方案 一、背景 服务有定时任务,当服务部署到多个节点时,每个节点在同一个时间点都会执行相同的定时任务,需要做的是,让同一个时间点,每一个定时任务只在一个节点上执行,避免重复执行。 二、 ...
  • 在互联网应用中,各式各样的定时任务存于系统各个角落。我们希望由一个平台统一将这些作业管理起来。通过这个系统,作业的宕机、崩溃等状态就可收入运维...什么是分布式定时任务中间件最大限度的减少人工干预不仅是...
  • 1. 什么是分布式定时任务 把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job xxl-job ...
  • LTS light-task-scheduler轻量级分布式任务调度框架学习

    万次阅读 热门讨论 2016-04-29 14:19:41
    任务执行完成:{ "job" :{ "cron" :true, "cronExpression" : "0/10 * * * * ?" , "extParams" :{ "shopId" : "111" }, "maxRetryTimes" : 0 , "needFeedback" :true, "priority" : 100 , "repeatCount" : 0 , ...
  • Java分布式定时任务--Elastic-job实践

    千次阅读 2018-09-09 09:33:08
    1,什么是Elastic-job Elastic-job 是一个分布式调度解决方案。 Elastic-Job由2个独立的子项目组成... Elastic-Job-Lite是一个无中心的解决方案,使用轻量级jar来协调分布式作业。 Elastic-Job-Lite和Elastic-Jo...
  • JAVA轻量级定时任务框架,用户通过该框架只需在配置文件中配置好继承了DTJobBase类的路径和定时任务表达式,即可开启定时任务,属于非常轻量级的定时任务框架。
  • 1、为什么需要定时任务 2、定时任务调度框架 2.1 单机 2.2 分布 3、xxl-job和elastic-job对比 3.1 支持集群部署方式 3.2 多节点部署任务执行方式 3.3 日志可追溯 3.4 监控告警 3.5 弹性扩容缩容 3.6 支持...
  • 分布式任务调度框架几乎是每个大型应用必备的工具,本文介绍了任务调度框架使用的需求背景和痛点,对业界普遍使用的开源分布式任务调度框架的使用进行了探究实践,并分析了这几种框架的优劣势和对自身业务的思考。...
  • 那么如何保证定时任务只在集群的某一个节点上执行,或者一个任务如何拆分为多个独立的任务项,由分布式的机器去分别执行, 众多的定时任务如何统一管理,现在有很多成熟的分布式定时任务框架,都能很好的实现上述的...
  • 分布式定时任务对比。
  • go轻量级分布式与微服务 毕业于清华大学,曾担任Google算法工程师,微软...
  • XXL-JOB分布式定时任务入门使用

    千次阅读 2019-05-08 14:33:34
    XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 1.2 特性 1、简单:支持通过Web页面对任务进行CRUD操作,...
  • 几种常用的分布式定时任务

    千次阅读 2020-04-28 10:04:22
    1. 什么是分布式定时任务 把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job xxl-job ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,895
精华内容 5,158
关键字:

java轻量级分布式定时任务

java 订阅