ShedLock作用
SchedulerLock的作用,确保任务在同一时刻最多执行一次。如果一个任务已经在一个节点上执行,则在其他节点上的执行不会等待,只需跳过它即可。
ShedLock通过外部存储实现锁,包括数据库、Redis、MongoDB、ZooKeeper等。本文以Redis作为存储为例。
实现过程
引入依赖
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-redis-spring</artifactId>
<version>2.5.0</version>
</dependency>
增加配置类
//标识该类为配置类
@Configuration
//开启定时器
@EnableScheduling
//开启定时任务锁,并设置默认锁最大时间为5分钟(PT为固定格式,M为时间单位)
@EnableSchedulerLock(defaultLockAtMostFor = "PT5M")
public class ShedLockConfig {
//初始化锁提供者,使用Redis作为外部存储
@Bean
public LockProvider lockProvider(RedisTemplate redisTemplate) {
return new RedisLockProvider(redisTemplate.getConnectionFactory());
}
}
创建定时任务
public class AutoRevokeScheduler{
//定时器时间配置 cron表达式
@Scheduled(cron = "*/10 * * * * ?")
//标识使用分布式锁
@SchedulerLock(name = "assignExpireOrderSchedule")
public void expireOrderSchedule() {
log.info("执行方法HailingScheduler-assignExpireOrderSchedule, " +
"耗时=" + (System.currentTimeMillis() - t1) + "ms");
}
}
网友评论