中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Spring Boot集成ShedLock分布式定時任務

發布時間:2021-05-24 09:16:52 來源:億速云 閱讀:334 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關怎么使用Spring Boot集成ShedLock分布式定時任務的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、ShedLock是什么?

以下是ShedLock鎖提供者,通過外部存儲實現鎖,由下圖可知外部存儲集成的庫還是很豐富的

怎么使用Spring Boot集成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: 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 創建Mysql數據表

# 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);

怎么使用Spring Boot集成ShedLock分布式定時任務

1.4 配置LockProvider

/**
 * @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
@CommonsLog
public 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 主啟動類

@SpringBootApplication
public class JdbcApplication {

    public static void main(String[] args) {
         SpringApplication.run(JdbcApplication.class, args);
    }

}

1.7 執行成功分析

可以看到兩個任務交替執行,并且我們的count每次自加1都是有序的。但是這里說明一下ShedLock是單線程執行的。

怎么使用Spring Boot集成ShedLock分布式定時任務

1.8 修改表名

shedLock支持關系型數據庫,以mysql為例,配置mysql以及表名;shedLock默認表名為shedlock,可以設置自定義表名。

怎么使用Spring Boot集成ShedLock分布式定時任務

核心思想:通過對公用的數據庫中的某個表進行記錄和加鎖,使得同一時間點只有第一個執行定時任務并成功在數據庫表中寫入相應記錄的節點能夠成功執行而其他節點直接跳過該任務。

springboot是什么

springboot一種全新的編程規范,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程,SpringBoot也是一個服務于框架的框架,服務范圍是簡化配置文件。

感謝各位的閱讀!關于“怎么使用Spring Boot集成ShedLock分布式定時任務”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武川县| 南乐县| 平谷区| 台东市| 绍兴县| 禹城市| 远安县| 开化县| 廊坊市| 石嘴山市| 射洪县| 屏南县| 裕民县| 蕉岭县| 襄垣县| 云龙县| 南皮县| 江西省| 海南省| 于田县| 郎溪县| 九龙坡区| 平塘县| 沽源县| 太仓市| 腾冲县| 平昌县| 和田县| 麻江县| 丹棱县| 衡山县| 石狮市| 巴彦县| 北票市| 子洲县| 惠来县| 开鲁县| 余庆县| 密山市| 简阳市| 绥滨县|