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.properties
或 application.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 等,只需更換相應的依賴和配置即可。