国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Spring Boot集成ShedLock分布式定時(shí)任務(wù)的實(shí)現示例

發(fā)布時(shí)間:2021-07-05 18:40 來(lái)源:腳本之家 閱讀:0 作者:DT辰白 欄目: 開(kāi)發(fā)技術(shù)

目錄

    一、ShedLock是什么?

    官方地址:

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

    本篇教程我們基于JdbcTemplate存儲為例來(lái)使用ShedLock鎖。

    二、落地實(shí)現

    1.1 引入依賴(lài)包

    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>
    

    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 創(chuàng )建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);
    

    1.4 配置LockProvider

    /**
     * @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()
            );
        }
    }
    

    1.5 創(chuàng )建定時(shí)Job

    /**
     * @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++) + "次");
        }
    
    }
    

    1.6 主啟動(dòng)類(lèi)

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

    1.7 執行成功分析

    可以看到兩個(gè)任務(wù)交替執行,并且我們的count每次自加1都是有序的。但是這里說(shuō)明一下ShedLock是單線(xiàn)程執行的。

    1.8 修改表名

    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í),將立刻刪除涉嫌侵權內容。

    精品亚洲A∨无码一区二区三区| 亚洲国产成人无码影片在线播放| 沈阳45老熟女高潮喷水亮点| 亚洲中文无码永久免弗| 正在播放国产剧情亂倫| 亚洲色18禁成人网站WWW|