- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- Spring Boot集成ShedLock分布式定時(shí)任務(wù)的實(shí)現示例
官方地址:
以下是ShedLock鎖提供者,通過(guò)外部存儲實(shí)現鎖,由下圖可知外部存儲集成的庫還是很豐富的
本篇教程我們基于JdbcTemplate存儲為例來(lái)使用ShedLock鎖。
shedlock所需依賴(lài)包:
<dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-spring</artifactId> <version>4.23.0</version> </dependency> <!--每個(gè)外部存儲實(shí)例所需依賴(lài)包不一樣,這里是jdbc--> <dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-provider-jdbc-template</artifactId> <version>4.23.0</version> </dependency>
JdbcTemplate依賴(lài)包:
<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工程依賴(lài)包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
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
# 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);
/** * @description: Shedlock集成Jdbc配置類(lèi) * @author: DT * @date: 2021/5/22 0:07 * @version: v1.0 */ // 標識該類(lèi)為配置類(lèi) @Configuration // //開(kāi)啟定時(shí)器 @EnableScheduling // 開(kāi)啟定時(shí)任務(wù)鎖,指定一個(gè)默認的鎖的時(shí)間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() ); } }
/** * @description: 開(kāi)啟分布式鎖定時(shí)任務(wù) * @author: DT * @date: 2021/5/22 0:23 * @version: v1.0 */ @Component @CommonsLog public class TimeTaskJob { private static Integer count = 1; // @SchedulerLock的作用是保證當前定時(shí)任務(wù)的方法執行時(shí)獲得鎖,忽略其他相同任務(wù)的執行 // name必須要指定,ShedLock就是根據這個(gè)name進(jìn)行相同任務(wù)判定的 // name:定時(shí)任務(wù)的名字,就是數據庫中的主鍵(name) // lockAtMostFor:鎖的最大時(shí)間單位為毫秒 // lockAtLeastFor:鎖的最小時(shí)間單位為毫秒 /** * 任務(wù)1每5秒執行一次 * lockAtLeastFor:雖然,定時(shí)任務(wù)是每隔5秒執行一次,但是,分布式鎖定義的是:每次任務(wù)要鎖住20秒,20秒是持有鎖的最小時(shí)間,必須等20秒后才釋放鎖,并且確保在20秒鐘內,該任務(wù)不會(huì )運行超過(guò)1次; * lockAtMostFor:鎖最大持有時(shí)間30秒,表示最多鎖定30秒鐘,主要用于防止執行任務(wù)的節點(diǎn)掛掉(即使這個(gè)節點(diǎn)掛掉,在30秒鐘后,鎖也被釋放),一般將其設置為明顯大于任務(wù)的最大執行時(shí)長(cháng);如果任務(wù)運行時(shí)間超過(guò)該值(即任務(wù)30秒鐘沒(méi)有執行完),則該任務(wù)可能被重復執行。 */ @Scheduled(cron = "0/5 * * * * ? ") @SchedulerLock(name = "testJob1",lockAtLeastFor = "20000", lockAtMostFor = "30000") public void scheduledTask1() { log.info(Thread.currentThread().getName() + "->>>任務(wù)1執行第:" + (count++) + "次"); } /** * 任務(wù)2每5秒執行一次 */ @Scheduled(cron = "0/5 * * * * ? ") @SchedulerLock(name = "testJob2") public void scheduledTask2() { log.info(Thread.currentThread().getName() + "->>>任務(wù)2執行第:" + (count++) + "次"); } }
@SpringBootApplication public class JdbcApplication { public static void main(String[] args) { SpringApplication.run(JdbcApplication.class, args); } }
可以看到兩個(gè)任務(wù)交替執行,并且我們的count每次自加1都是有序的。但是這里說(shuō)明一下ShedLock是單線(xiàn)程執行的。
shedLock支持關(guān)系型數據庫,以mysql為例,配置mysql以及表名;shedLock默認表名為shedlock,可以設置自定義表名。
核心思想:通過(guò)對公用的數據庫中的某個(gè)表進(jìn)行記錄和加鎖,使得同一時(shí)間點(diǎn)只有第一個(gè)執行定時(shí)任務(wù)并成功在數據庫表中寫(xiě)入相應記錄的節點(diǎn)能夠成功執行而其他節點(diǎn)直接跳過(guò)該任務(wù)。
以上就是Spring Boot集成ShedLock分布式定時(shí)任務(wù)的實(shí)現示例的詳細內容,更多關(guān)于Spring Boot集成ShedLock分布式定時(shí)任務(wù)的資料請關(guān)注腳本之家其它相關(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)站