欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot 集成 ShedLock 分布式鎖的示例詳解

 更新時間:2021年08月18日 15:48:57   作者:weixin_35688430  
ShedLock是一個在分布式環(huán)境中使用的定時任務框架,用于解決在分布式環(huán)境中的多個實例的相同定時任務在同一時間點重復執(zhí)行的問題,本文重點給大家介紹SpringBoot 分布式鎖ShedLock的相關知識,感興趣的朋友一起看看吧

一:ShedLock 簡介

ShedLock是一個在分布式環(huán)境中使用的定時任務框架,用于解決在分布式環(huán)境中的多個實例的相同定時任務在同一時間點重復執(zhí)行的問題。ShedLock確保計劃的任務最多同時執(zhí)行一次。如果一個任務正在一個節(jié)點上執(zhí)行,它會獲得一個鎖,該鎖將阻止從另一個節(jié)點(或線程)執(zhí)行同一任務。請注意,如果一個任務已經在一個節(jié)點上執(zhí)行,則在其他節(jié)點上的執(zhí)行不會等待,只是將其跳過。。簡單來說,ShedLock本身只做一件事情:保證一個任務最多同時執(zhí)行一次。所以如官網所說的,ShedLock不是一個分布式調度器,只是一個鎖!

注意:ShedLock支持Mongo,Redis,Hazelcast,ZooKeeper以及任何帶有JDBC驅動程序的東西。本例子使用的是基于Redis的方式。之所以不適用基于jdbc存儲的主要原因是考慮到大量數據下的數據庫壓力的原因,若本身基于jdbc等,可直接參考官網給出的提示:

創(chuàng)建對應的表結構。

CREATE TABLE shedlock(
    name VARCHAR(64), 
    lock_until TIMESTAMP(3) NULL, 
    locked_at TIMESTAMP(3) NULL, 
    locked_by  VARCHAR(255), 
    PRIMARY KEY (name)
)

二:配置maven 依賴

<dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-spring</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-provider-redis-spring</artifactId>
            <version>2.3.0</version>
        </dependency>
        
        <!--spring2.0集成redis所需common-pool2 -->
        <!-- 必須加上,jedis依賴此 若項目中已經引入jedis 請忽略此步驟-->
        <!-- spring boot 2.0 的操作手冊有標注 大家可以去看看 地址是:https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/ -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

添加jedis 依賴 若項目中已經引入jedis 請忽略此步驟

 <!--spring2.0集成redis所需common-pool2 -->
        <!-- 必須加上,jedis依賴此 若項目中已經引入jedis 請忽略此步驟-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

三:SchedulerLock 基于 Redis 的配置

配置 lockProvider 并且開啟 @EnableSchedulerLock 標簽

import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.redis.spring.RedisLockProvider;
import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;

/**
 * @Description SchedulerLock 基于 Redis 的配置
 * @Author 
 * @Date 2020/2/22 18:27
 **/
@Configuration
//defaultLockAtMostFor 指定在執(zhí)行節(jié)點結束時應保留鎖的默認時間使用ISO8601 Duration格式
//作用就是在被加鎖的節(jié)點掛了時,無法釋放鎖,造成其他節(jié)點無法進行下一任務
//這里默認55s
//關于ISO8601 Duration格式用的不到,具體可上網查詢下相關資料,應該就是一套規(guī)范,規(guī)定一些時間表達方式
@EnableSchedulerLock(defaultLockAtMostFor = "PT55S")
public class ShedLockRedisConfig {

    @Value("${spring.profiles.active}")
    private String env;

    @Bean
    public LockProvider lockProvider(RedisConnectionFactory connectionFactory) {
        //環(huán)境變量 -需要區(qū)分不同環(huán)境避免沖突,如dev環(huán)境和test環(huán)境,兩者都部署時,只有一個實例進行,此時會造成相關環(huán)境未啟動情況
        return new RedisLockProvider(connectionFactory, env);
    }
}

四:在啟動類中添加 @EnableScheduling 標簽

注意,要在啟動類上添加 @EnableScheduling ,表明開啟定時器服務。若不加定時器是不會起效的。

@SpringBootApplication
@EnableScheduling
public class EpidemicMessageApplication {

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

五:test 測試案例

//區(qū)分服務
    @Value("${server.port}")
    private String port;
    
    @Scheduled(cron = "0 */1 * * * ?")
    /**
     * lockAtLeastForString的作用是為了防止在任務開始之初由于各個服務器同名任務的服務器時間差,啟動時間差等這些造成的一些問題,有了這個時間設置后,
     *     就可以避免因為上面這些小的時間差造成的一些意外,保證一個線程在搶到鎖后,即便很快執(zhí)行完,也不要立即釋放,留下一個緩沖時間。
     *     這樣等多個線程都啟動后,由于任務已經被鎖定,其他沒有獲得鎖的任務也不會再去搶鎖。注意這里的時間不要設置幾秒幾分鐘,盡量大些
     *lockAtMostForString 這個設置的作用是為了防止搶到鎖的那個線程,因為一些意外死掉了,而鎖又始終不被釋放。
     *     這樣的話,雖然當前執(zhí)行周期雖然失敗了,但以后的執(zhí)行周期如果這里一直不釋放的話,后面就永遠執(zhí)行不到了。
     *     它的目的不在于隱藏任務,更重要的是,釋放鎖,并且查找解決問題。
     *至于是否帶有string后綴,只是2種表達方式,數字類型的就是毫秒數,字符串類型的就有自己固定的格式 ,例如:PT30S  30s時間設置,單位可以是S,M,H
     */
    @SchedulerLock(name = "scheduledController_notice", lockAtLeastForString = "PT15M", lockAtMostForString = "PT14M")
    public StandardResult notice() {
        try {
            logger.info(port + "- 執(zhí)行定時器 scheduledController_notice");
            return StandardResult.ok();
        } catch (Exception e) {
            logger.error("異常信息:", e);
            return StandardResult.faild("異常信息", e);
        }
    }

SchedulerLock注解說明
@SchedulerLock注解一共支持五個參數,分別是

name:用來標注一個定時服務的名字,被用于寫入數據庫作為區(qū)分不同服務的標識,如果有多個同名定時任務則同一時間點只有一個執(zhí)行成功
lockAtMostFor:成功執(zhí)行任務的節(jié)點所能擁有獨占鎖的最長時間,單位是毫秒ms
lockAtMostForString:成功執(zhí)行任務的節(jié)點所能擁有的獨占鎖的最長時間的字符串表達,例如“PT14M”表示為14分鐘,單位可以是S,M,H
lockAtLeastFor:成功執(zhí)行任務的節(jié)點所能擁有獨占所的最短時間,單位是毫秒ms
lockAtLeastForString:成功執(zhí)行任務的節(jié)點所能擁有的獨占鎖的最短時間的字符串表達,例如“PT14M”表示為14分鐘,單位可以是S,M,H

到此這篇關于SpringBoot 集成 ShedLock 分布式鎖的文章就介紹到這了,更多相關SpringBoot 分布式鎖ShedLock內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用Java的Lucene搜索工具對檢索結果進行分組和分頁

    使用Java的Lucene搜索工具對檢索結果進行分組和分頁

    這篇文章主要介紹了使用Java的搜索工具Lucene對檢索結果進行分組和分頁的方法,Luence是Java環(huán)境中的一個全文檢索引擎工具包,需要的朋友可以參考下
    2016-03-03
  • Java 三種進制的數值常量操作

    Java 三種進制的數值常量操作

    這篇文章主要介紹了Java 三種進制的數值常量操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java中int轉string與string轉int的效率對比

    java中int轉string與string轉int的效率對比

    這篇文章主要介紹了java中int轉string與string轉int的效率對比,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring注解之@Conditional使用解析

    Spring注解之@Conditional使用解析

    這篇文章主要介紹了Spring注解之@Conditional使用解析,@Conditional注解可以說是SpringBoot的條件注解,表示組件只有在所有指定條件都匹配時才有資格注冊,條件是可以在 bean 定義注冊之前??以編程方式確定的任何狀態(tài),需要的朋友可以參考下
    2024-01-01
  • java基本教程之java線程等待與java喚醒線程 java多線程教程

    java基本教程之java線程等待與java喚醒線程 java多線程教程

    這篇文章主要介紹了對線程等待/喚醒方法,文中使用了多個示例,大家參考使用吧
    2014-01-01
  • Quartz之Job與JobDetail深入解析

    Quartz之Job與JobDetail深入解析

    下面小編就為大家?guī)硪黄猀uartz之Job與JobDetail深入解析。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Spring?AOP操作的相關術語及環(huán)境準備

    Spring?AOP操作的相關術語及環(huán)境準備

    這篇文章主要為大家介紹了Spring?AOP操作的相關術語及環(huán)境準備學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Java設計模式之橋模式(Bridge模式)介紹

    Java設計模式之橋模式(Bridge模式)介紹

    這篇文章主要介紹了Java設計模式之橋模式(Bridge模式)介紹,本文講解了為什么使用橋模式、如何實現橋模式、Bridge模式在EJB中的應用等內容,需要的朋友可以參考下
    2015-03-03
  • springdata jpa使用Example快速實現動態(tài)查詢功能

    springdata jpa使用Example快速實現動態(tài)查詢功能

    這篇文章主要介紹了springdata jpa使用Example快速實現動態(tài)查詢功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 如何將IDEA打成jar包并在windows后臺運行

    如何將IDEA打成jar包并在windows后臺運行

    在本篇文章里小編給大家分享的是關于如何將IDEA打成jar包并在windows后臺運行知識點,需要的朋友們可以學習參考下。
    2019-08-08

最新評論