首页 > 数据库 >springboot 如何使用MongoDB集成 shedlock-spring

springboot 如何使用MongoDB集成 shedlock-spring

时间:2024-07-04 19:57:44浏览次数:20  
标签:springboot spring org springframework MongoDB mongodb shedlock import

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

标签:springboot,spring,org,springframework,MongoDB,mongodb,shedlock,import
From: https://www.cnblogs.com/gongchengship/p/18284569

相关文章

  • springboot 中每分钟执行一次的 cron 表达式怎么写
    在SpringBoot中,如果你需要使用Cron表达式来每分钟执行一次任务,可以使用Spring的@Scheduled注解。Cron表达式是一种用来表示时间点的字符串,通过这些字符串,你可以非常灵活地定义任务的执行时间。Cron表达式格式Cron表达式由六个或七个字段组成,按以下顺序排列:秒(Seconds):0-59分......
  • 基于SpringBoot的财务管理系统
    系统主要包括首页,个人中心,员工管理,部门管理,员工工资管理,工资调整管理,资产类别管理,固定资产管理,经营信息管理,序时账管理,年度利润管理,系统管理等功能模块。......
  • Spring Reactor基本介绍和案例
    1.Reactor对比1.1Reactor线程模型Reactor线程模型就是通过单个线程使用JavaNIO包中的Selector的select()方法,进行监听。当获取到事件(如accept、read等)后,就会分配(dispatch)事件进行相应的事件处理(handle)。如果要给Reactor线程模型下一个更明确的定义,应该是:Re......
  • 如何在SpringBoot项目中使用Activiti工作流(整套代码)
      前言activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。一、项目形式springboot+vue+activiti集成了activiti在线编辑器,流行的前后端分离部署开发模式,快速开发平台,可插拔工作流服务......
  • springboot006基于SpringBoot的网上订餐系统
    简介【毕设项目推荐javaweb项目】基于springboot+vue的网上订餐系统(springboot006)适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考,不得用于商业或者非法用途,否则,一切后果请用户自负。看运行截图看第五章获取资料方式项目编号:springboot00......
  • spring事务失效情况
    Spring事务可能在以下几种情况下失效:非托管代码:如果在事务管理的边界之外调用业务方法,那么事务将不会生效。例如,在同一个类中调用一个被@Transactional注解的方法,由于方法调用是在同一栈帧内,因此不会触发AOP代理,也就无法实现事务。异常被捕获并处理:如果在业务逻辑中出现......
  • SpringBoot拦截器中获取注解、拦截器中注入Service
    拦截器中获取注解来源:https://blog.csdn.net/wangmx1993328/article/details/81030268/publicclassJWTInterceptorimplementsHandlerInterceptor{privateSysSettingServicesysSettingService;//构造函数传入ServicepublicJWTInterceptor(SysSettingServ......
  • 基于java+springboot+vue实现的校园外卖服务系统(文末源码+Lw)292
    摘   要传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,外卖信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的校园外卖服务系统。本......
  • 基于java+springboot+vue实现的宠物商城网站(文末源码+Lw)273
    摘   要传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,商品信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的宠物商城网站。本宠物......
  • SpringBoot自动装配
     没有SpringBoot的情况下,如果我们需要引入第三方依赖,需要手动配置,非常麻烦。但是,SpringBoot中,我们直接引入一个starter即可。比如你想要在项目中使用redis的话,直接在项目中引入对应的starter即可。<dependency><groupId>org.springframework.boot</groupId......