Spring Boot集成ShedLock分布式定時任務的實現示例
官方地址:github.com/lukas-kreca…
以下是ShedLock鎖提供者,通過外部存儲實現鎖,由下圖可知外部存儲集成的庫還是很豐富的
本篇教程我們基于JdbcTemplate存儲為例來使用ShedLock鎖。
二、落地實現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 配置數據庫連接信息
server: port: 9999spring: 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.MysqlDataSource1.3 創建Mysql數據表
# MySQL, MariaDBCREATE 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));# PostgresCREATE 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));# OracleCREATE 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 SQLCREATE 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));# DB2CREATE 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配置類 * @author: DT * @date: 2021/5/22 0:07 * @version: v1.0 */// 標識該類為配置類@Configuration// //開啟定時器@EnableScheduling// 開啟定時任務鎖,指定一個默認的鎖的時間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 創建定時Job
/** * @description: 開啟分布式鎖定時任務 * @author: DT * @date: 2021/5/22 0:23 * @version: v1.0 */@Component@CommonsLogpublic class TimeTaskJob { private static Integer count = 1; // @SchedulerLock的作用是保證當前定時任務的方法執行時獲得鎖,忽略其他相同任務的執行 // name必須要指定,ShedLock就是根據這個name進行相同任務判定的 // name:定時任務的名字,就是數據庫中的主鍵(name) // lockAtMostFor:鎖的最大時間單位為毫秒 // lockAtLeastFor:鎖的最小時間單位為毫秒 /** * 任務1每5秒執行一次 * lockAtLeastFor:雖然,定時任務是每隔5秒執行一次,但是,分布式鎖定義的是:每次任務要鎖住20秒,20秒是持有鎖的最小時間,必須等20秒后才釋放鎖,并且確保在20秒鐘內,該任務不會運行超過1次; * lockAtMostFor:鎖最大持有時間30秒,表示最多鎖定30秒鐘,主要用于防止執行任務的節點掛掉(即使這個節點掛掉,在30秒鐘后,鎖也被釋放),一般將其設置為明顯大于任務的最大執行時長;如果任務運行時間超過該值(即任務30秒鐘沒有執行完),則該任務可能被重復執行。 */ @Scheduled(cron = '0/5 * * * * ? ') @SchedulerLock(name = 'testJob1',lockAtLeastFor = '20000', lockAtMostFor = '30000') public void scheduledTask1() {log.info(Thread.currentThread().getName() + '->>>任務1執行第:' + (count++) + '次'); } /** * 任務2每5秒執行一次 */ @Scheduled(cron = '0/5 * * * * ? ') @SchedulerLock(name = 'testJob2') public void scheduledTask2() {log.info(Thread.currentThread().getName() + '->>>任務2執行第:' + (count++) + '次'); }}1.6 主啟動類
@SpringBootApplicationpublic class JdbcApplication { public static void main(String[] args) { SpringApplication.run(JdbcApplication.class, args); }}1.7 執行成功分析
可以看到兩個任務交替執行,并且我們的count每次自加1都是有序的。但是這里說明一下ShedLock是單線程執行的。
shedLock支持關系型數據庫,以mysql為例,配置mysql以及表名;shedLock默認表名為shedlock,可以設置自定義表名。
核心思想:通過對公用的數據庫中的某個表進行記錄和加鎖,使得同一時間點只有第一個執行定時任務并成功在數據庫表中寫入相應記錄的節點能夠成功執行而其他節點直接跳過該任務。
以上就是Spring Boot集成ShedLock分布式定時任務的實現示例的詳細內容,更多關于Spring Boot集成ShedLock分布式定時任務的資料請關注好吧啦網其它相關文章!
相關文章:
1. Docker究竟是什么 為什么這么流行 它的優點和缺陷有哪些?2. idea打開多個窗口的操作方法3. IntelliJ IDEA設置編碼格式的方法4. IDEA 重新導入依賴maven 命令 reimport的方法5. 如何通過vscode運行調試javascript代碼6. Java14發布了,再也不怕NullPointerException了7. IntelliJ IDEA 2020.2正式發布,兩點多多總能助你提效8. Intellij IDEA 閱讀源碼的 4 個絕技(必看)9. IntelliJ IDEA 統一設置編碼為utf-8編碼的實現10. IntelliJ IDEA設置背景圖片的方法步驟
