- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- SpringBoot配置ShedLock分布式定時(shí)任務(wù)
ShedLock是一個(gè)在分布式環(huán)境中使用的定時(shí)任務(wù)框架,用于解決在分布式環(huán)境中的多個(gè)實(shí)例的相同定時(shí)任務(wù)在同一時(shí)間點(diǎn)重復執行的問(wèn)題,解決思路是通過(guò)對公用的數據庫中的某個(gè)表進(jìn)行記錄和加鎖,使得同一時(shí)間點(diǎn)只有第一個(gè)執行定時(shí)任務(wù)并成功在數據庫表中寫(xiě)入相應記錄的節點(diǎn)能夠成功執行而其他節點(diǎn)直接跳過(guò)該任務(wù)。當然不只是數據庫,目前已經(jīng)實(shí)現的支持數據存儲類(lèi)型除了經(jīng)典的關(guān)系型數據庫,還包括MongoDB,Zookeeper,Redis,Hazelcast。
ShedLock采用非侵入式編程的思想,通過(guò)注解的方式來(lái)實(shí)現相應的功能。
要使用ShedLock,請執行以下操作
首先,引入依賴(lài)
< dependency > < groupId > net.javacrumbs.shedlock </ groupId > < artifactId > shedlock-spring </ artifactId > < version > 2.5.0 </ version > </ dependency >
現在我們需要將庫集成到Spring中。為了啟用計劃鎖定,請使用@EnableSchedulerLock注釋
@Configuration @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = “ PT30S ”) 類(lèi) MySpringConfiguration { ... }
注釋您的計劃任務(wù)
import net.javacrumbs.shedlock.core.SchedulerLock ; ... @Scheduled(...)@ SchedulerLock(name = “ scheduledTaskName ”) public void scheduledTask(){ //做某事 }
@SchedulerLock注解一共支持五個(gè)參數,分別是
name 用來(lái)標注一個(gè)定時(shí)服務(wù)的名字,被用于寫(xiě)入數據庫作為區分不同服務(wù)的標識,如果有多個(gè)同名定時(shí)任務(wù)則同一時(shí)間點(diǎn)只有一個(gè)執行成功
lockAtMostFor 成功執行任務(wù)的節點(diǎn)所能擁有獨占鎖的最長(cháng)時(shí)間,單位是毫秒ms
lockAtMostForString 成功執行任務(wù)的節點(diǎn)所能擁有的獨占鎖的最長(cháng)時(shí)間的字符串表達,例如“PT14M”表示為14分鐘
lockAtLeastFor 成功執行任務(wù)的節點(diǎn)所能擁有獨占所的最短時(shí)間,單位是毫秒ms
lockAtLeastForString 成功執行任務(wù)的節點(diǎn)所能擁有的獨占鎖的最短時(shí)間的字符串表達,例如“PT14M”表示為14分鐘
TaskScheduler代理
需要配置兩個(gè)Bean,一個(gè)是lockProvider,一個(gè)是scheduler
默認情況下,ShedLock在Spring周?chē)鷦?chuàng )建AOP代理TaskScheduler。如果未指定任務(wù)計劃程序,則會(huì )為您創(chuàng )建默認任務(wù)計劃程序。如果您有特殊需求,只需創(chuàng )建一個(gè)bean實(shí)現TaskScheduler接口,它將自動(dòng)包裝到AOP代理中。
由于ShedLock使用Mongo,JDBC數據庫,Redis,Hazelcast,ZooKeeper等外部存儲進(jìn)行協(xié)調。所以我選擇的是redis。
<dependency> <groupId> net.javacrumbs.shedlock </ groupId > <artifactId > shedlock-provider-redis-spring </ artifactId > <version> 2.5.0 </version> </dependency > <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
@Configuration @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT5M") public class ShedLockConfig { @Bean public LockProvider lockProvider(RedisTemplate redisTemplate){ return new RedisLockProvider(redisTemplate.getConnectionFactory()); } @Bean public TaskScheduler taskScheduler(){ return new MySpecialTaskScheduler(); } }
如果你有更多特殊需求,可以像這樣使用Scheduled Method代理
@EnableSchedulerLock(mode = PROXY_METHOD,defaultLockAtMostFor = “ PT30S ”)
如果PROXY_METHOD選擇了mode,則ShedLock會(huì )在每個(gè)帶@SchedulerLock注釋的方法周?chē)鷦?chuàng )建AOP代理。這種方法的主要優(yōu)點(diǎn)是它不依賴(lài)于Spring調度。缺點(diǎn)是即使您直接調用該方法也會(huì )應用鎖定。還要注意,目前僅支持void返回方法,如果您注釋并調用具有非void返回類(lèi)型的方法,則會(huì )引發(fā)異常。
到此這篇關(guān)于SpringBoot配置ShedLock分布式定時(shí)任務(wù)的文章就介紹到這了,更多相關(guān)SpringBoot ShedLock分布式定時(shí)任務(wù)內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站