springboot 如何使用MongoDB集成 shedlock-spring

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

posted @ 2024-07-04 19:57  gongchengship  阅读(13)  评论(0编辑  收藏  举报