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 {@Beanpublic 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 等,只需更换相应的依赖和配置即可。