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