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 等,只需更换相应的依赖和配置即可。
标签:springboot,spring,org,springframework,MongoDB,mongodb,shedlock,import From: https://www.cnblogs.com/gongchengship/p/18284569