您好,登錄后才能下訂單哦!
這篇文章主要介紹了Spring Cloud分布式定時器之ShedLock的實現方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
ShedLock是一個在分布式環境中使用的定時任務框架,用于解決在分布式環境中的多個實例的相同定時任務在同一時間點重復執行的問題。
解決思路是通過對公用的數據庫中的某個表進行記錄和加鎖,使得同一時間點只有第一個執行定時任務并成功在數據庫表中寫入相應記錄的節點能夠成功執行而其他節點直接跳過該任務。
目前已經實現的支持數據存儲類型不僅僅只有關系型數據庫,還包括MongoDB,Zookeeper,Redis,Hazelcast。
在pom文件中添加shedLock相關依賴
<!--shedlock--> <dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-spring</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-provider-jdbc-template</artifactId> <version>2.2.0</version> </dependency>
在啟動類添加@EnableScheduling和@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")注解,表示要啟動ShedLock定時任務
defaultLockAtMostFor要設置值,不設置會報錯;設置值一般設置比定時任務大點值,一般在每個定時任務中都會配置defaultLockAtMostFor值,會覆蓋啟動類中的值
@EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") public class OneStopServiceApplication { public static void main(String[] args) { SpringApplication.run(OneStopServiceApplication.class, args); } }
shedLock支持關系型數據庫,以mysql為例,配置mysql以及表名;shedLock默認表名為shedlock,可以設置自定義表名。
@Configuration public class ScheduledLockConfig { @Bean public LockProvider lockProvider(DataSource dataSource) { //自定義表名 return new JdbcTemplateLockProvider(dataSource,"ccsy_shedlock"); } }
@Component public class HourTask { /** * 最小鎖定時間,一般設置成定時任務小一點 */ private static final int MIN_LOCK_TIME = 1000;//單位毫秒 /** * 最大鎖定時間,一般設置成比正常執行時間長的值 */ private static final int MAX_LOCK_TIME = 1000 * 2;//單位毫秒 @Scheduled(cron = "0/1 * * * * ? ") @SchedulerLock(name = "測試", lockAtMostFor = MAX_LOCK_TIME, lockAtLeastFor = MIN_LOCK_TIME) public void visitCountTaskByTwoHour() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("現在時間是" + format.format(new Date())+ Thread.currentThread().getName()); } }
@SchedulerLock注解一共支持五個參數,分別是
name 用來標注一個定時服務的名字,被用于寫入數據庫作為區分不同服務的標識,如果有多個同名定時任務則同一時間點只有一個執行成功
lockAtMostFor 成功執行任務的節點所能擁有獨占鎖的最長時間,單位是毫秒ms
lockAtMostForString 成功執行任務的節點所能擁有的獨占鎖的最長時間的字符串表達,例如“PT14M”表示為14分鐘
lockAtLeastFor 成功執行任務的節點所能擁有獨占所的最短時間,單位是毫秒ms
lockAtLeastForString 成功執行任務的節點所能擁有的獨占鎖的最短時間的字符串表達,例如“PT14M”表示為14分鐘
CREATE TABLE ccsy_shedlock ( NAME VARCHAR ( 64 ), lock_until TIMESTAMP ( 3 ) NULL, locked_at TIMESTAMP ( 3 ) NULL, locked_by VARCHAR ( 255 ), PRIMARY KEY ( NAME ))
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Spring Cloud分布式定時器之ShedLock的實現方法”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。