springboot 如何使用MongoDB整合 shedlock-spring

gongchengship發表於2024-07-04

ShedLock 是一個用於防止在分散式環境中任務重複執行的庫。它允許多個節點共享一個任務排程器,並確保同一時間只有一個節點能夠執行某個任務。Spring Boot 專案中可以透過整合 shedlock-spring 來實現這一功能。下面是一個完整的整合指南:

1. 新增依賴

首先,需要在 pom.xml 中新增 shedlock-spring 以及選定的儲存後端的依賴。下面以使用 MongoDB 作為儲存後端為例:

<dependencies>
    <!-- ShedLock Spring Integration -->
    <dependency>
        <groupId>net.javacrumbs.shedlock</groupId>
        <artifactId>shedlock-spring</artifactId>
        <version>4.33.0</version>
    </dependency>
    <!-- MongoDB Lock Provider -->
    <dependency>
        <groupId>net.javacrumbs.shedlock</groupId>
        <artifactId>shedlock-provider-mongo</artifactId>
        <version>4.33.0</version>
    </dependency>
    <!-- Spring Boot MongoDB Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
</dependencies>

2. 配置 MongoDB

application.propertiesapplication.yml 中配置 MongoDB 的連線資訊:

application.properties

spring.data.mongodb.uri=mongodb://localhost:27017/mydatabase

application.yml

spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/mydatabase

3. 配置 ShedLock

建立一個配置類來配置 ShedLock:

import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.mongo.MongoLockProvider;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ShedLockConfig {

    @Bean
    public LockProvider lockProvider() {
        return new MongoLockProvider(MongoClients.create("mongodb://localhost:27017").getDatabase("mydatabase"));
    }
}

4. 建立任務

使用 @Scheduled 註解和 @SchedulerLock 註解來定義需要鎖的任務:

import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    @Scheduled(cron = "0 0/5 * * * ?") // 每5分鐘執行一次
    @SchedulerLock(name = "scheduledTaskName", lockAtLeastFor = "PT4M", lockAtMostFor = "PT14M")
    public void scheduledTask() {
        // 任務的具體邏輯
        System.out.println("Executing scheduled task...");
    }
}

5. 啟用定時任務

確保在 Spring Boot 應用中啟用了定時任務排程。可以在主應用類上新增 @EnableScheduling 註解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

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

6. 執行應用

啟動 Spring Boot 應用。您應該會看到定時任務每 5 分鐘執行一次,並且在分散式環境中只有一個節點會執行任務。

結論

透過以上步驟,您可以在 Spring Boot 專案中整合 ShedLock,並使用它來防止定時任務在分散式環境中重複執行。根據需要,您也可以選擇其他支援的儲存後端如 PostgreSQL、MySQL 等,只需更換相應的依賴和配置即可。

相關文章