Spring Boot集成ShedLock分布式定時任務(wù)的實現(xiàn)示例
一、ShedLock是什么?
以下是ShedLock鎖提供者,通過外部存儲實現(xiàn)鎖,由下圖可知外部存儲集成的庫還是很豐富的
本篇教程我們基于JdbcTemplate存儲為例來使用ShedLock鎖。
二、落地實現(xiàn)
1.1 引入依賴包
shedlock所需依賴包:
<dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-spring</artifactId> <version>4.23.0</version> </dependency> <!--每個外部存儲實例所需依賴包不一樣,這里是jdbc--> <dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-provider-jdbc-template</artifactId> <version>4.23.0</version> </dependency>
JdbcTemplate依賴包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
web工程依賴包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
1.2 配置數(shù)據(jù)庫連接信息
server: port: 9999 spring: datasource: url: jdbc:mysql://192.168.31.158:3306/testjdbc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver type: com.mysql.cj.jdbc.MysqlDataSource
1.3 創(chuàng)建Mysql數(shù)據(jù)表
# MySQL, MariaDB CREATE TABLE shedlock(name VARCHAR(64) NOT NULL, lock_until TIMESTAMP(3) NOT NULL, locked_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name)); # Postgres CREATE TABLE shedlock(name VARCHAR(64) NOT NULL, lock_until TIMESTAMP NOT NULL, locked_at TIMESTAMP NOT NULL, locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name)); # Oracle CREATE TABLE shedlock(name VARCHAR(64) NOT NULL, lock_until TIMESTAMP(3) NOT NULL, locked_at TIMESTAMP(3) NOT NULL, locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name)); # MS SQL CREATE TABLE shedlock(name VARCHAR(64) NOT NULL, lock_until datetime2 NOT NULL, locked_at datetime2 NOT NULL, locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name)); # DB2 CREATE TABLE shedlock(name VARCHAR(64) NOT NULL PRIMARY KEY, lock_until TIMESTAMP NOT NULL, locked_at TIMESTAMP NOT NULL, locked_by VARCHAR(255) NOT NULL);
1.4 配置LockProvider
/** * @description: Shedlock集成Jdbc配置類 * @author: DT * @date: 2021/5/22 0:07 * @version: v1.0 */ // 標(biāo)識該類為配置類 @Configuration // //開啟定時器 @EnableScheduling // 開啟定時任務(wù)鎖,指定一個默認(rèn)的鎖的時間30秒 @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") public class ShedlockJdbcConfig { /** * 配置鎖的提供者 */ @Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider( JdbcTemplateLockProvider.Configuration.builder() .withJdbcTemplate(new JdbcTemplate(dataSource)) .usingDbTime() .build() ); } }
1.5 創(chuàng)建定時Job
/** * @description: 開啟分布式鎖定時任務(wù) * @author: DT * @date: 2021/5/22 0:23 * @version: v1.0 */ @Component @CommonsLog public class TimeTaskJob { private static Integer count = 1; // @SchedulerLock的作用是保證當(dāng)前定時任務(wù)的方法執(zhí)行時獲得鎖,忽略其他相同任務(wù)的執(zhí)行 // name必須要指定,ShedLock就是根據(jù)這個name進(jìn)行相同任務(wù)判定的 // name:定時任務(wù)的名字,就是數(shù)據(jù)庫中的主鍵(name) // lockAtMostFor:鎖的最大時間單位為毫秒 // lockAtLeastFor:鎖的最小時間單位為毫秒 /** * 任務(wù)1每5秒執(zhí)行一次 * lockAtLeastFor:雖然,定時任務(wù)是每隔5秒執(zhí)行一次,但是,分布式鎖定義的是:每次任務(wù)要鎖住20秒,20秒是持有鎖的最小時間,必須等20秒后才釋放鎖,并且確保在20秒鐘內(nèi),該任務(wù)不會運行超過1次; * lockAtMostFor:鎖最大持有時間30秒,表示最多鎖定30秒鐘,主要用于防止執(zhí)行任務(wù)的節(jié)點掛掉(即使這個節(jié)點掛掉,在30秒鐘后,鎖也被釋放),一般將其設(shè)置為明顯大于任務(wù)的最大執(zhí)行時長;如果任務(wù)運行時間超過該值(即任務(wù)30秒鐘沒有執(zhí)行完),則該任務(wù)可能被重復(fù)執(zhí)行。 */ @Scheduled(cron = "0/5 * * * * ? ") @SchedulerLock(name = "testJob1",lockAtLeastFor = "20000", lockAtMostFor = "30000") public void scheduledTask1() { log.info(Thread.currentThread().getName() + "->>>任務(wù)1執(zhí)行第:" + (count++) + "次"); } /** * 任務(wù)2每5秒執(zhí)行一次 */ @Scheduled(cron = "0/5 * * * * ? ") @SchedulerLock(name = "testJob2") public void scheduledTask2() { log.info(Thread.currentThread().getName() + "->>>任務(wù)2執(zhí)行第:" + (count++) + "次"); } }
1.6 主啟動類
@SpringBootApplication public class JdbcApplication { public static void main(String[] args) { SpringApplication.run(JdbcApplication.class, args); } }
1.7 執(zhí)行成功分析
可以看到兩個任務(wù)交替執(zhí)行,并且我們的count每次自加1都是有序的。但是這里說明一下ShedLock是單線程執(zhí)行的。
1.8 修改表名
shedLock支持關(guān)系型數(shù)據(jù)庫,以mysql為例,配置mysql以及表名;shedLock默認(rèn)表名為shedlock,可以設(shè)置自定義表名。
總結(jié)
核心思想:通過對公用的數(shù)據(jù)庫中的某個表進(jìn)行記錄和加鎖,使得同一時間點只有第一個執(zhí)行定時任務(wù)并成功在數(shù)據(jù)庫表中寫入相應(yīng)記錄的節(jié)點能夠成功執(zhí)行而其他節(jié)點直接跳過該任務(wù)。
以上就是Spring Boot集成ShedLock分布式定時任務(wù)的實現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot集成ShedLock分布式定時任務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java處理轉(zhuǎn)義字符↑ → ↓ 保存后的展示還原操作
這篇文章主要介紹了java處理轉(zhuǎn)義字符↑ → ↓ 保存后的展示還原操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06mybatis-plus查詢無數(shù)據(jù)問題及解決
這篇文章主要介紹了mybatis-plus查詢無數(shù)據(jù)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12Java Swing組件下拉菜單控件JComboBox用法示例
這篇文章主要介紹了Java Swing組件下拉菜單控件JComboBox用法,結(jié)合具體實例形式分析了Swing組件下拉菜單控件JComboBox的具體定義、使用方法及相關(guān)使用注意事項,需要的朋友可以參考下2017-11-11java中將一個實體類復(fù)制到另一個實體類的3種方法示例
這篇文章主要給大家介紹了關(guān)于java中將一個實體類復(fù)制到另一個實體類的3種方法,所謂實體類就是一個擁有Set和Get方法的類,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Java gRPC攔截器簡單實現(xiàn)分布式日志鏈路追蹤器過程詳解
有請求的發(fā)送、處理,當(dāng)然就會有攔截器的需求,例如在服務(wù)端通過攔截器統(tǒng)一進(jìn)行請求認(rèn)證等操作,這些就需要攔截器來完成,今天松哥先和小伙伴們來聊一聊gRPC中攔截器的基本用法,后面我再整一篇文章和小伙伴們做一個基于攔截器實現(xiàn)的JWT認(rèn)證的gRPC2023-03-03Java?BigDecimal類的一般使用、BigDecimal轉(zhuǎn)double方式
這篇文章主要介紹了Java?BigDecimal類的一般使用、BigDecimal轉(zhuǎn)double方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01SpringBoot+Idea熱部署實現(xiàn)流程解析
這篇文章主要介紹了SpringBoot+Idea熱部署實現(xiàn)流程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11