1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 318字,需瀏覽 1分鐘

         ·

        2021-12-13 13:25

        前言

        ShedLock確保您計(jì)劃的任務(wù)最多同時執(zhí)行一次。如果一個任務(wù)正在一個節(jié)點(diǎn)上執(zhí)行,則它會獲得一個鎖,該鎖將阻止從另一個節(jié)點(diǎn)(或線程)執(zhí)行同一任務(wù)。請注意,如果一個任務(wù)已經(jīng)在一個節(jié)點(diǎn)上執(zhí)行,則在其他節(jié)點(diǎn)上的執(zhí)行不會等待,只是將其跳過。ShedLock使用外部存儲(如Mongo,JDBC數(shù)據(jù)庫,Redis,Hazelcast,ZooKeeper或其他存儲庫)進(jìn)行協(xié)調(diào)。

        注意:官網(wǎng)說明,它僅僅是一個分布式鎖,并不是調(diào)度程序。


        一、ShedLock是什么?

        官方地址:github.com/lukas-kreca…

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

        本篇教程我們基于JdbcTemplate存儲為例來使用ShedLock鎖。

        二、落地實(shí)現(xiàn)

        1.1 引入依賴包

        shedlock所需依賴包:


        net.javacrumbs.shedlock
        shedlock-spring
        4.23.0



        net.javacrumbs.shedlock
        shedlock-provider-jdbc-template
        4.23.0

        復(fù)制代碼

        JdbcTemplate依賴包:


        org.springframework.boot
        spring-boot-starter-jdbc


        mysql
        mysql-connector-java
        runtime

        復(fù)制代碼

        web工程依賴包:


        org.springframework.boot
        spring-boot-starter-web

        復(fù)制代碼

        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
        復(fù)制代碼

        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);
        復(fù)制代碼

        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()
        );
        }
        }
        復(fù)制代碼

        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ù)不會運(yùn)行超過1次;
        * lockAtMostFor:鎖最大持有時間30秒,表示最多鎖定30秒鐘,主要用于防止執(zhí)行任務(wù)的節(jié)點(diǎn)掛掉(即使這個節(jié)點(diǎn)掛掉,在30秒鐘后,鎖也被釋放),一般將其設(shè)置為明顯大于任務(wù)的最大執(zhí)行時長;如果任務(wù)運(yùn)行時間超過該值(即任務(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++) + "次");
        }

        }
        復(fù)制代碼

        1.6 主啟動類

        @SpringBootApplication
        public class JdbcApplication {

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

        }
        復(fù)制代碼

        1.7 執(zhí)行成功分析

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

        1.7 修改表名

        shedLock支持關(guān)系型數(shù)據(jù)庫,以mysql為例,配置mysql以及表名;shedLock默認(rèn)表名為shedlock,可以設(shè)置自定義表名。

        總結(jié)

        核心思想:通過對公用的數(shù)據(jù)庫中的某個表進(jìn)行記錄和加鎖,使得同一時間點(diǎn)只有第一個執(zhí)行定時任務(wù)并成功在數(shù)據(jù)庫表中寫入相應(yīng)記錄的節(jié)點(diǎn)能夠成功執(zhí)行而其他節(jié)點(diǎn)直接跳過該任務(wù)。


        作者:DT辰白
        鏈接:https://juejin.cn/post/6964947403128438821
        來源:稀土掘金
        著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。



        瀏覽 97
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            潘金莲裸体高潮 | 女人30分钟高潮毛片 | 操初中女生 | 91视频美女 | 波多野结衣的毛片 | 特级毛片A片久久久久久 | 四虎官方网站 | 久久久久7777 | 在线a人片免费观看视频 | 女王sm榨精免费一区二区 |