最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成ShedLock實現(xiàn)分布式定時任務的示例代碼

 更新時間:2024年12月13日 08:53:31   作者:小馬打代碼  
ShedLock 是一個 Java 庫,通常用于分布式系統(tǒng)中,確保定時任務(Scheduled Tasks)在集群環(huán)境下只被某一個實例執(zhí)行一次,本文給大家介紹了SpringBoot集成ShedLock實現(xiàn)分布式定時任務的示例代碼,需要的朋友可以參考下

1、什么是ShedLock?

ShedLock 是一個 Java 庫,通常用于分布式系統(tǒng)中,確保定時任務(Scheduled Tasks)在集群環(huán)境下只被某一個實例執(zhí)行一次。它通過在共享資源(例如數(shù)據(jù)庫或分布式緩存)中添加鎖的方式,避免多個實例同時執(zhí)行相同的任務

ShedLock 的工作原理

1.分布式鎖:

在任務開始時,ShedLock 會嘗試在數(shù)據(jù)庫(或其他存儲)中創(chuàng)建一個鎖。
如果某個實例成功獲取鎖,則只有它能執(zhí)行該任務。

2.鎖的生命周期:

鎖會有一個明確的過期時間(鎖的持有時間,lockAtLeastFor 和 lockAtMostFor 參數(shù)配置)。
鎖過期后,即使任務異常終止,其他實例也可以重新獲取鎖。

3.支持的存儲:

支持多種鎖存儲,包括數(shù)據(jù)庫(如 MySQL、PostgreSQL)、Redis、MongoDB 等。

應用場景

1、分布式定時任務控制

在分布式環(huán)境中,多個實例會同時調(diào)度定時任務。如果沒有控制,可能導致任務重復執(zhí)行。ShedLock 確保只有一個實例能運行任務。

例如:
生成日報表的定時任務。
清理過期數(shù)據(jù)的批處理任務。

2、避免重復任務執(zhí)行

即使在單實例環(huán)境中,也可以使用 ShedLock 避免因意外重啟或配置錯誤導致同一任務被多次觸發(fā)。

3、事件驅(qū)動任務的冪等性

當某些任務需要對同一事件觸發(fā)處理時,使用 ShedLock 可以確保一個事件只被處理一次。

4、任務重試機制

如果任務需要重試(例如在發(fā)生錯誤時),ShedLock 能避免多個實例同時重試相同任務。

2、代碼工程

實驗目的
使用ShedLock 來確保在分布式環(huán)境中只有一個實例能運行任務

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.1</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>shedlock</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-spring</artifactId>
            <version>5.5.0</version>
        </dependency>
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-provider-jdbc-template</artifactId>
            <version>5.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
    </dependencies>
</project>

config

package com.demo.config;

import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Configuration
public class ShedLockConfig {

    @Bean
    public LockProvider lockProvider(DataSource dataSource) {
        return new JdbcTemplateLockProvider(
            JdbcTemplateLockProvider.Configuration.builder()
                .withJdbcTemplate(new JdbcTemplate(dataSource))
                .usingDbTime() // Works with PostgreSQL, MySQL, MariaDb, MS SQL, Oracle, HSQL, H2, DB2, and others
                .build()
        );
    }
}

cron

package com.demo.cron;

import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class SchedulerConfig {

    @Scheduled(cron = "0 0/1 * * * ?")
    @SchedulerLock(name = "scheduledTaskName", lockAtMostFor = "PT10M", lockAtLeastFor = "PT1M")
    public void scheduledTask() {
        //  some logic code
        System.out.println("Executing scheduled task");
    }

}

@Scheduled(cron = “0 0/1 * * * ?”)

1、定義定時任務的調(diào)度時間。

2、表達式含義:任務每分鐘的整點觸發(fā),例如 12:00、12:01、12:02。

3、注意:多個實例(分布式環(huán)境)都會在同一時間調(diào)度到此任務,但通過 ShedLock 確保只有一個實例能真正執(zhí)行。

@SchedulerLock

1、鎖的最短持有時間為 1分鐘。

2、即使任務提前完成,鎖仍會持有至少 1 分鐘,防止其他實例快速重復執(zhí)行任務。

3、鎖的最長持有時間為 10分鐘。

4、如果任務運行超出 10 分鐘,即使沒有主動釋放鎖,也會自動過期,其他實例可以繼續(xù)獲取鎖。

5、定義鎖的唯一標識。共享存儲(如數(shù)據(jù)庫或 Redis)中會記錄此鎖的狀態(tài)。

6、使用 ShedLock 來管理分布式鎖。

7、name = “scheduledTaskName”:

8、lockAtMostFor = “PT10M”:

9、lockAtLeastFor = “PT1M”:

任務邏輯

1、System.out.println(“Executing scheduled task”); 是任務的業(yè)務邏輯。

2、此邏輯只會在獲得鎖的實例上執(zhí)行。

配置文件

node1節(jié)點

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
server.port=8081

node2節(jié)點

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
server.port=8082

3、測試

1、啟動node1節(jié)點
java -jar myapp.jar --spring.profiles.active=node1

2、啟動node2節(jié)點
java -jar myapp.jar --spring.profiles.active=node2

通過控制臺觀察日志,可以發(fā)現(xiàn),2個實例交替獲取到鎖執(zhí)行,而不是同一時刻一起執(zhí)行

4、注意事項

  • 任務時間控制: 確保任務的實際執(zhí)行時間小于 lockAtMostFor,否則任務可能被其他實例重復執(zhí)行。
  • 冪等性: 任務邏輯應盡量設計為冪等的(重復執(zhí)行不會產(chǎn)生副作用),以應對鎖機制的潛在異常情況。
  • 存儲配置: 確保使用高可用的鎖存儲(如數(shù)據(jù)庫或 Redis),否則鎖機制可能失效。

以上就是SpringBoot集成ShedLock實現(xiàn)分布式定時任務的示例代碼的詳細內(nèi)容,更多關(guān)于SpringBoot ShedLock分布式定時任務的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java可以寫android的應用程序嗎

    Java可以寫android的應用程序嗎

    在本篇文章里小編給大家整理的是一篇關(guān)于Java可以寫android的應用程序嗎的相關(guān)基礎文章,有興趣的朋友們可以學習下。
    2020-11-11
  • Spring?MVC全局異常處理實戰(zhàn)詳細指南

    Spring?MVC全局異常處理實戰(zhàn)詳細指南

    在Spring MVC框架中統(tǒng)一異常處理是一項重要的功能,它能夠幫助開發(fā)者集中管理并標準化系統(tǒng)中的異常處理流程,提高代碼的可讀性和可維護性,這篇文章主要介紹了Spring?MVC全局異常處理實戰(zhàn)的相關(guān)資料,需要的朋友可以參考下
    2026-02-02
  • Spring AOP 自定義注解的實現(xiàn)代碼

    Spring AOP 自定義注解的實現(xiàn)代碼

    本篇文章主要介紹了Spring AOP 自定義注解的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • JAVA基礎--如何通過異常處理錯誤

    JAVA基礎--如何通過異常處理錯誤

    這篇文章主要介紹了JAVA中如何通過異常處理錯誤,文中講解非常細致,代碼幫助大家更好的理解,感興趣的朋友可以了解下
    2020-06-06
  • Java編程在方法中哪些時候需要參數(shù)

    Java編程在方法中哪些時候需要參數(shù)

    這篇文章主要介紹了Java編程在方法中哪些時候需要參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java實現(xiàn)訂單超時自動取消的完整設計方案

    Java實現(xiàn)訂單超時自動取消的完整設計方案

    在電商、外賣、票務等業(yè)務中,“訂單超時自動取消” 是保障資源高效利用的核心功能,本文完整講解了訂單超時自動取消的設計思路,覆蓋不同業(yè)務規(guī)模的選型與避坑點,希望對大家有所幫助
    2025-11-11
  • SpringBoot使用prometheus監(jiān)控的示例代碼

    SpringBoot使用prometheus監(jiān)控的示例代碼

    這篇文章主要介紹了SpringBoot使用prometheus監(jiān)控的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Java線程同步、同步方法實例詳解

    Java線程同步、同步方法實例詳解

    本篇文章主要通過實例介紹了Java線程:線程的同步-同步方法,需要的朋友可以參考下
    2017-04-04
  • Java實現(xiàn)將TXT文本文件轉(zhuǎn)換為PDF文件

    Java實現(xiàn)將TXT文本文件轉(zhuǎn)換為PDF文件

    與TXT文本文件,PDF文件更加專業(yè)也更適合傳輸,所以這篇文章小編主要為大家詳細介紹了如何使用Java實現(xiàn)將TXT文本文件轉(zhuǎn)換為PDF文件 ,需要的可以參考下
    2024-02-02
  • Java中try-with-resources使用教程

    Java中try-with-resources使用教程

    try-with-resources是Java7引入的一種資源管理機制,用于自動關(guān)閉實現(xiàn)了AutoCloseable接口的資源,避免資源泄漏,提升代碼安全性和簡潔性,下面就來介紹一下使用小結(jié),感興趣的可以了解一下
    2026-01-01

最新評論

巴彦淖尔市| 定边县| 鹿邑县| 莒南县| 邢台县| 桐城市| 晋宁县| 手游| 福安市| 县级市| 漳州市| 开平市| 疏附县| 安顺市| 石棉县| 高青县| 荣成市| 喀喇沁旗| 高碑店市| 宁化县| 航空| 临西县| 黔江区| 滨海县| 嘉兴市| 资中县| 苏州市| 和平区| 恭城| 龙陵县| 蕉岭县| 大冶市| 浦江县| 和政县| 丘北县| 汾西县| 吉木萨尔县| 十堰市| 曲松县| 新竹县| 东海县|