分布式定时任务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