分布式定时任务SchedulerLock的配置

分布式定时任务SchedulerLock的配置

分布式定时任务的配置,现在项目中使用了定时任务,因为要部署到多台服务其中就出现同一时间一个定时任务同时执行的问题。
本来是我是想在项目中集成 xxl-job 的但是由于种种问题没有让集成。
最后使用了SchedulerLock,下面先来进行一顿操作后再进行参数的了解,因为我也对参数的具体配置不是太具体的了解。
我这里是跟MySQL数据进行的所以添加的是jdbc的依赖
数据库的pom依赖

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

接下来开始写配置类

@Component
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();
    }

}

启动类的配置

@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")

现在开始写定时任务
我这里是将七子表达式与name配置到配置文件中了,lockAtMostFor 与lockAtLeastFor 配置的常量

    private static final int SYSUSERMOST = 58*60*1000;

    private static final int SYSUSERLEAST = 58*60*1000;

    @Scheduled(cron = "${cronJobs.sysUser}")
    @SchedulerLock(name = "${schedulerLockJob.name.sysUser}", lockAtMostFor = SYSUSERMOST, lockAtLeastFor = SYSUSERLEAST)
    @Transactional(rollbackFor = Exception.class)
    public void syncDataUser() throws IOException {
		代码省略........
	}

Redis的配置

如果是Redis的话添加一下依赖

        <!-- shedlock-->
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-spring</artifactId>
            <version>0.17.0</version>
        </dependency>
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-provider-jedis</artifactId>
            <version>0.17.0</version>
        </dependency>

Redis的配置类配置

@Configuration
public class ShedlockConfig {

//redis配置文件
    @Autowired
    private RedisConfigProperties redis;

    @Bean
    public ScheduledLockConfiguration taskScheduler(LockProvider lockProvider) {
        return ScheduledLockConfigurationBuilder
                .withLockProvider(lockProvider)
                .withPoolSize(10)
                .withDefaultLockAtMostFor(Duration.ofMinutes(10))
                .build();
    }
    @Bean
    public LockProvider lockProvider() {
        JedisPool jedisPool = new JedisPool(redis.getHost(), redis.getPort());
        return new JedisLockProvider(jedisPool);
    }
}
@EnableFeignClients
@EnableSwagger2
@EnableScheduling //重点,没有这个定时任务无法执行
@EnableHystrix
@SpringCloudApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application .class, args);
    }
}
private static final int FOUR_MIN = 4 * 60 * 1000;

   
    @Scheduled(cron = "0 5 0 * * ?")
    @SchedulerLock(name = "updateTimeOutAppoint", lockAtMostFor = FOUR_MIN, lockAtLeastFor = FOUR_MIN)
    public void updateTimeOutAppoint(){
        appointService.updateTimeOutAppoint();
    }

数据库表需要自己创建而表中数据是程序自己添加的
在这里插入图片描述
在这里插入图片描述

参数配置:
@SchedulerLock:

只有带注释的方法被锁定,库忽略所有其他计划的任务。您还必须指定锁的名称。同一时间只能执行一个任务

name:

分布式锁名称,注意 锁名称必须唯一

lockAtMostFor & lockAtMostForString

指定在执行节点死亡时应将锁保留多长时间。这只是一个备用选项,在正常情况下,任务完成后立即释放锁定。 您必须将其设置lockAtMostFor为比正常执行时间长得多的值。如果任务花费的时间超过 lockAtMostFor了所导致的行为,则可能无法预测(更多的进程将有效地持有该锁)。
lockAtMostFor 单位 毫秒
lockAtMostForString 使用“ PT14M” 意味着它将被锁定不超过14分钟。

lockAtLeastFor & lockAtLeastForString

该属性指定应保留锁定的最短时间。其主要目的是在任务很短且节点之间的时钟差的情况下,防止从多个节点执行。

https://blog.csdn.net/m0_37897396/article/details/81772742

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值