SchedulerLock的做用,确保任务在同一时刻最多执行一次。若是一个任务已经在一个节点上执行,则在其余节点上的执行不会等待,只需跳过它便可。
ShedLock经过外部存储实现锁,包括数据库、Redis、MongoDB、ZooKeeper等。本文以Redis做为存储为例。java
<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"); } }