Spring Cloud分布式定時(shí)器之ShedLock的實(shí)現(xiàn)
在實(shí)際的項(xiàng)目開(kāi)發(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ù)表中寫(xiě)入相應(yīng)記錄的節(jié)點(diǎn)能夠成功執(zhí)行而其他節(jié)點(diǎn)直接跳過(guò)該任務(wù)。
目前已經(jīng)實(shí)現(xiàn)的支持?jǐn)?shù)據(jù)存儲(chǔ)類(lèi)型不僅僅只有關(guān)系型數(shù)據(jù)庫(kù),還包括MongoDB,Zookeeper,Redis,Hazelcast。
1. pom文件添加相關(guān)依賴(lài)
在pom文件中添加shedLock相關(guān)依賴(lài)
<!--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)類(lèi)添加@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)類(lèi)中的值
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class OneStopServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OneStopServiceApplication.class, args);
}
}
3.添加ShedLock配類(lèi)
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ù)的名字,被用于寫(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分鐘
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)文章
SpringBoot同時(shí)支持HTTPS與HTTP的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot同時(shí)支持HTTPS與HTTP的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
PageHelper插件實(shí)現(xiàn)服務(wù)器端分頁(yè)功能
這篇文章主要為大家詳細(xì)介紹了PageHelper插件實(shí)現(xiàn)服務(wù)器端分頁(yè)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
springboot實(shí)現(xiàn)執(zhí)行sql語(yǔ)句打印到控制臺(tái)
這篇文章主要介紹了springboot實(shí)現(xiàn)執(zhí)行sql語(yǔ)句打印到控制臺(tái)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
ThreadLocal內(nèi)存泄漏問(wèn)題解決方案
這篇文章主要介紹了ThreadLocal內(nèi)存泄漏問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Vue中computed計(jì)算屬性和data數(shù)據(jù)獲取方式
這篇文章主要介紹了Vue中computed計(jì)算屬性和data數(shù)據(jù)獲取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
如何開(kāi)發(fā)一個(gè)簡(jiǎn)單的Akka Java應(yīng)用
這篇文章主要介紹了如何開(kāi)發(fā)一個(gè)簡(jiǎn)單的Akka Java應(yīng)用 ,幫助大家使用Java創(chuàng)建Akka項(xiàng)目并將其打包,感興趣的朋友可以了解下2020-10-10

