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"); } }