Spring Cloud分布式定時(shí)器之ShedLock的實(shí)現(xiàn)
在實(shí)際的項(xiàng)目開發(fā)工作中,我們經(jīng)常會(huì)遇到需要做一些定時(shí)任務(wù)的工作,那么在Spring Cloud中是如何實(shí)現(xiàn)的?今天來(lái)介紹下其中的一種解決方案——輕量級(jí)分布式定時(shí)鎖ShedLock
ShedLock
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ù)表中寫入相應(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。
1. pom文件添加相關(guān)依賴
在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>
2. 添加相關(guān)配置
在啟動(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); } }
3.添加ShedLock配類
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"); } }
4.ShedLock定時(shí)任務(wù)
@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ù)的名字,被用于寫入數(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分鐘
5.創(chuàng)建mysql數(shù)據(jù)庫(kù)中定時(shí)任務(wù)ccsy_shedlock表
CREATE TABLE ccsy_shedlock ( NAME VARCHAR ( 64 ), lock_until TIMESTAMP ( 3 ) NULL, locked_at TIMESTAMP ( 3 ) NULL, locked_by VARCHAR ( 255 ), PRIMARY KEY ( NAME ))
到此這篇關(guān)于Spring Cloud分布式定時(shí)器之ShedLock的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Spring Cloud分布式定時(shí)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring Cloud中關(guān)于Feign的常見(jiàn)問(wèn)題總結(jié)
- 詳解Spring Cloud Zuul中路由配置細(xì)節(jié)
- Springcloud-nacos實(shí)現(xiàn)配置和注冊(cè)中心的方法
- 深入理解Spring Cloud Zuul過(guò)濾器
- Spring Cloud學(xué)習(xí)教程之DiscoveryClient的深入探究
- 在idea環(huán)境下構(gòu)建springCloud項(xiàng)目
- Spring Cloud學(xué)習(xí)教程之Zuul統(tǒng)一異常處理與回退
- 詳解Spring Cloud Feign 熔斷配置的一些小坑
- Spring Cloud升級(jí)最新Finchley版本的所有坑
相關(guān)文章
hadoop client與datanode的通信協(xié)議分析
本文主要分析了hadoop客戶端read和write block的流程. 以及client和datanode通信的協(xié)議, 數(shù)據(jù)流格式等2012-11-1123種設(shè)計(jì)模式(22)java狀態(tài)模式
這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java狀態(tài)模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01RabbitMQ消息隊(duì)列中多路復(fù)用Channel信道詳解
這篇文章主要介紹了RabbitMQ消息隊(duì)列中多路復(fù)用Channel信道詳解,消息Message是指在應(yīng)用間傳送的數(shù)據(jù),消息可以非常簡(jiǎn)單,比如只包含文本字符串,也可以更復(fù)雜,可能包含嵌入對(duì)象,需要的朋友可以參考下2023-08-08