广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot怎么集成ShedLock实现分布式定时任务
  • 650
分享到

SpringBoot怎么集成ShedLock实现分布式定时任务

2023-07-05 06:07:46 650人浏览 安东尼
摘要

本文小编为大家详细介绍“SpringBoot怎么集成ShedLock实现分布式定时任务”,内容详细,步骤清晰,细节处理妥当,希望这篇“springBoot怎么集成ShedLock实现分布式定时任务”文章能帮助大家解决疑惑,下面跟着小编的思路

本文小编为大家详细介绍“SpringBoot怎么集成ShedLock实现分布式定时任务”,内容详细,步骤清晰,细节处理妥当,希望这篇“springBoot怎么集成ShedLock实现分布式定时任务”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    一、背景

    项目服务是集群部署的时候,代码在每个人都会有定时任务,但是如果让每个节点都去跑定时任务是不大合适的。SpringBoot 中的 ShedLock 可以很好解决这个问题,下面我将为大家详细介绍 SpringBoot 如何集成 ShedLock,而 ShedLock 又是如何实现分布式定时的。

    二、ShedLock是什么

    以下是ShedLock提供者,通过外部存储实现锁,由下图可知外部存储集成的库还是很丰富:

    SpringBoot怎么集成ShedLock实现分布式定时任务

    三、落地实现

    1.1 引入依赖包

    shedlock所需依赖包:

    <!-- WEB工程依赖包 --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency><dependency>    <groupId>net.javacrumbs.shedlock</groupId>    <artifactId>shedlock-spring</artifactId>    <version>4.2.0</version></dependency> <!--每个外部存储实例所需依赖包不一样,这里是jdbc--><dependency>    <groupId>net.javacrumbs.shedlock</groupId>    <artifactId>shedlock-provider-jdbc-template</artifactId>    <version>4.2.0</version></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency>    <groupId>mysql</groupId>    <artifactId>Mysql-connector-java</artifactId>    <scope>runtime</scope></dependency>

    依赖包树形图:

    SpringBoot怎么集成ShedLock实现分布式定时任务

    1.2 配置数据库连接信息

    server:
      port: 8105
    spring:
      datasource:
        url: jdbc:mysql://127.0.0.1:3306/testjdbc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
        username: root
        passWord: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.mysql.cj.jdbc.MysqlDataSource

    1.3 创建Mysql数据表

    CREATE TABLE `shedlock` (`name`  varchar(64) NOT NULL COMMENT 'name' ,`lock_until`  timestamp(3) NULL DEFAULT NULL ,`locked_at`  timestamp(3) NULL DEFAULT NULL ,`locked_by`  varchar(255) NULL DEFAULT NULL ,PRIMARY KEY (`name`))ENGINE=InnoDBDEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_0900_ai_ciROW_FORMAT=DYNAMIC;

    1.4 配置LockProvider

    ShedLockConfig.java:

    import net.javacrumbs.shedlock.core.LockProvider;import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;import javax.annotation.Resource;import javax.sql.DataSource;@Componentpublic class ShedLockConfig {    @Resource    private DataSource dataSource;    @Bean    private LockProvider lockProvider() {        return new JdbcTemplateLockProvider(dataSource);    }}

    springboot主启动类MerakQuartzApplication:

    import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;import org.mybatis.spring.annotation.MapperScan;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;import org.springframework.context.annotation.Bean;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;import java.util.concurrent.Executor;import java.util.concurrent.ThreadPoolExecutor;// 开启定时器@EnableScheduling// 开启定时任务锁,指定一个默认的锁的时间30秒@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")@EnableAsync@MapperScan(basePackages = {"com.merak.hyper.automation.persist.**.mapper"})@SpringBootApplication(scanBasePackages = {"com.merak.hyper.automation.**"}, exclude = {SecurityAutoConfiguration.class})public class MerakQuartzApplication {    public static final Logger log = LoggerFactory.getLogger(MerakQuartzApplication.class);    public static void main(String[] args) {        SpringApplication.run(MerakQuartzApplication.class, args);    }    private int taskSchedulerCorePoolSize = 15;    private int awaitTerminationSeconds = 60;    private String threadNamePrefix = "taskExecutor-";        @Bean    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();        taskScheduler.setPoolSize(taskSchedulerCorePoolSize);        taskScheduler.setThreadNamePrefix(threadNamePrefix);        taskScheduler.setWaitForTasksToCompleteOnShutdown(false);        taskScheduler.setAwaitTerminationSeconds(awaitTerminationSeconds);                taskScheduler.initialize();//        isinitialized = true;        log.info("初始化ThreadPoolTaskScheduler ThreadNamePrefix=" + threadNamePrefix + ",PoolSize=" + taskSchedulerCorePoolSize                + ",awaitTerminationSeconds=" + awaitTerminationSeconds);        return taskScheduler;    }        @Bean("asyncTaskExecutor")    public Executor taskExecutor() {        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();        taskExecutor.setCorePoolSize(5);        taskExecutor.setMaxPoolSize(50);        taskExecutor.setQueueCapacity(200);        taskExecutor.seTKEepAliveSeconds(60);        taskExecutor.setThreadNamePrefix("asyncTaskExecutor-");        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);        taskExecutor.setAwaitTerminationSeconds(60);        //修改拒绝策略为使用当前线程执行        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        //初始化线程池        taskExecutor.initialize();        return taskExecutor;    }}

    1.5 创建定时Job

    DigitalEmpTask:

    package com.merak.hyper.automation.quartz.task;import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;import java.util.List;@Componentpublic class DigitalEmpTask {    public static final Logger log = LoggerFactory.getLogger(DigitalEmpTask.class);    @Scheduled(cron = "0/30 * * * * ?")    @SchedulerLock(name = "digitalEmpTaskScheduler", lockAtMostFor = "PT25S", lockAtLeastFor = "PT25S")    protected void digitalEmpTaskScheduler() {        log.info("云执行调度中心1:任务开始执行,时间:" + DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS));        try {         } catch (Exception e) {            log.error("云执行调度中心1调度失败,原因:" + e.getMessage());        }      }}

    四、结果分析

    分别启动两个服务节点,配置如下:

    server:
      port: 12105
      servlet:
        context-path: /automation-quartz-one

    server:
      port: 12106
      servlet:
        context-path: /automation-quartz-two

    运行日志(片断)

    节点automation-quartz-one 运行日志:
    2023-02-22 12:01:00.143 [taskExecutor-1] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:01:00
    2023-02-22 12:05:00.114 [taskExecutor-3] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:05:00
    2023-02-22 12:05:30.122 [taskExecutor-6] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:05:30
    2023-02-22 12:19:30.110 [taskExecutor-3] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:19:30

    节点automation-quartz-two运行日志:
    2023-02-22 12:01:30.109 [taskExecutor-3] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:01:30
    2023-02-22 12:02:00.101 [taskExecutor-1] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:02:00
    2023-02-22 12:02:30.105 [taskExecutor-2] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:02:30
    2023-02-22 12:03:00.118 [taskExecutor-3] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:03:00
    2023-02-22 12:03:30.101 [taskExecutor-4] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:03:30
    2023-02-22 12:04:00.110 [taskExecutor-1] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:04:00
    2023-02-22 12:04:30.111 [taskExecutor-5] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:04:30
    2023-02-22 12:06:00.114 [taskExecutor-13] INFO <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:06:00
    2023-02-22 12:06:30.108 [taskExecutor-14] INFO <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:06:30
    2023-02-22 12:07:00.114 [taskExecutor-15] INFO <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:07:00
    2023-02-22 12:07:30.115 [taskExecutor-1] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:07:30
    2023-02-22 12:08:00.102 [taskExecutor-5] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:08:00
    2023-02-22 12:08:30.103 [taskExecutor-11] INFO <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:08:30
    2023-02-22 12:09:00.099 [taskExecutor-6] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:09:00
    2023-02-22 12:09:30.113 [taskExecutor-3] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:09:30
    2023-02-22 12:10:00.107 [taskExecutor-7] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:10:00
    2023-02-22 12:10:30.110 [taskExecutor-15] INFO <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:10:30
    2023-02-22 12:11:00.111 [taskExecutor-1] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:11:00
    2023-02-22 12:11:30.100 [taskExecutor-5] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:11:30
    2023-02-22 12:12:00.112 [taskExecutor-11] INFO <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:12:00
    2023-02-22 12:12:30.102 [taskExecutor-6] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:12:30
    2023-02-22 12:13:00.097 [taskExecutor-3] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:13:00
    2023-02-22 12:13:30.107 [taskExecutor-14] INFO <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:13:30
    2023-02-22 12:14:00.111 [taskExecutor-4] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:14:00
    2023-02-22 12:14:30.106 [taskExecutor-8] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:14:30
    2023-02-22 12:15:00.095 [taskExecutor-9] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:15:00
    2023-02-22 12:15:30.101 [taskExecutor-10] INFO <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:15:30
    2023-02-22 12:16:00.105 [taskExecutor-2] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:16:00
    2023-02-22 12:16:30.130 [taskExecutor-12] INFO <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:16:30
    2023-02-22 12:17:00.107 [taskExecutor-13] INFO <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:17:00
    2023-02-22 12:17:30.113 [taskExecutor-7] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:17:30
    2023-02-22 12:18:00.104 [taskExecutor-15] INFO <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:18:00
    2023-02-22 12:18:30.112 [taskExecutor-1] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:18:30
    2023-02-22 12:19:00.103 [taskExecutor-5] INFO  <DigitalEmpTask:46> - 云执行调度中心1:任务开始执行,时间:2023-02-22 12:19:00

    shedlock表记录信息:

    SpringBoot怎么集成ShedLock实现分布式定时任务

    读到这里,这篇“SpringBoot怎么集成ShedLock实现分布式定时任务”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: SpringBoot怎么集成ShedLock实现分布式定时任务

    本文链接: https://www.lsjlt.com/news/349970.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • SpringBoot怎么集成ShedLock实现分布式定时任务
      本文小编为大家详细介绍“SpringBoot怎么集成ShedLock实现分布式定时任务”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot怎么集成ShedLock实现分布式定时任务”文章能帮助大家解决疑惑,下面跟着小编的思路...
      99+
      2023-07-05
    • SpringBoot集成ShedLock实现分布式定时任务流程详解
      目录一、背景二、ShedLock是什么三、落地实现1.1 引入依赖包1.2 配置数据库连接信息1.3 创建Mysql数据表1.4 配置LockProvider1.5 创建定时Job四...
      99+
      2023-02-24
      SpringBoot ShedLock SpringBoot ShedLock分布式定时任务 SpringBoot分布式定时任务
    • SpringBoot配置ShedLock分布式定时任务
      什么是ShedLock ShedLock是一个在分布式环境中使用的定时任务框架,用于解决在分布式环境中的多个实例的相同定时任务在同一时间点重复执行的问题,解决思路是通过对公用的数据...
      99+
      2022-11-12
    • 怎么使用Spring Boot集成ShedLock分布式定时任务
      这篇文章给大家分享的是有关怎么使用Spring Boot集成ShedLock分布式定时任务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、ShedLock是什么?以下是ShedLock锁提供者,通过外部存储实现...
      99+
      2023-06-15
    • Spring Boot集成ShedLock分布式定时任务的实现示例
      目录一、ShedLock是什么?二、落地实现1.1 引入依赖包1.2 配置数据库连接信息1.3 创建Mysql数据表1.4 配置LockProvider1.5 创建定时Job1.6 ...
      99+
      2022-11-12
    • 如何在SpringBoot中配置ShedLock分布式定时任务
      本篇文章为大家展示了如何在SpringBoot中配置ShedLock分布式定时任务,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是ShedLockShedLock是一个在分布式环境中使用的定时任...
      99+
      2023-06-15
    • SpringBoot集成quartz实现定时任务详解
      目录准备知识点什么是QuartzQuartz的体系结构什么是Quartz持久化实现案例 - 单实例方式实现案例 - 分布式方式后端实现前端实现测试效果准备知识点 需要了解常用的Qua...
      99+
      2022-11-13
      SpringBoot quartz定时任务 SpringBoot 定时任务 SpringBoot quartz
    • springboot整合xxl-job实现分布式定时任务的过程
      目录一、前言二、xxl-job介绍三、修改配置1. 运行sql文件2. 修改xxl-job-admin配置3. 需修改xxl-job-executor-sample-springbo...
      99+
      2022-11-13
      springboot整合xxl-job定时任务 springboot整合xxl-job springboot定时任务
    • SpringBoot定时任务怎么实现
      这篇文章主要讲解了“SpringBoot定时任务怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot定时任务怎么实现”吧!SpringBoot定时任务主要由两个注解完成...
      99+
      2023-06-05
    • redis如何实现分布式定时任务
      Redis本身并不直接支持分布式定时任务的功能,但可以通过Redis的一些特性和与其他组件的结合来实现分布式定时任务。一种常见的实现...
      99+
      2023-09-06
      redis
    • springboot定时任务和异步任务怎么实现
      这篇文章主要介绍“springboot定时任务和异步任务怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot定时任务和异步任务怎么实现”文章能帮助大家解决问题。异步任务简单案例...
      99+
      2023-06-27
    • 如何利用Redis实现分布式定时任务
      Redis是一个出色的键值存储系统,除了作为缓存使用,还有许多其他用途。其中之一便是作为分布式定时任务的实现工具。在本文中,我们将介绍如何利用Redis实现分布式定时任务,同时提供相应的代码示例。什么是分布式定时任务?在单机环境中,我们可以...
      99+
      2023-11-07
      分布式 redis 定时任务
    • PHP中使用Redis实现分布式定时任务
      Redis是一种高性能的内存数据库,它具有快速的读写速度、支持一定级别的持久性和丰富的数据类型等优点。Redis常被用于缓存、消息队列、实时排行榜等场景。在开发中,我们有时会需要实现分布式的定时任务,比如:发送邮件、清理临时文件、更新缓存等...
      99+
      2023-05-15
      分布式 PHP redis
    • Java中怎么实现SpringBoot定时任务
      今天就跟大家聊聊有关Java中怎么实现SpringBoot定时任务,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. SpringBoot--任务:定时任务项目开发中经常需要执行一些...
      99+
      2023-06-20
    • SpringBoot定时任务功能怎么实现
      本篇内容介绍了“SpringBoot定时任务功能怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一 背景项目中需要一个可以动态新增定时...
      99+
      2023-06-30
    • Springboot怎么通过Scheduled实现定时任务
      小编给大家分享一下Springboot怎么通过Scheduled实现定时任务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!定时任务一般会存在中大型企业级项目中,为...
      99+
      2023-05-30
      springboot
    • SpringBoot怎么使用Schedule实现定时任务
      本文小编为大家详细介绍“SpringBoot怎么使用Schedule实现定时任务”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot怎么使用Schedule实现定时任务”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
      99+
      2023-07-05
    • web分布式定时任务调度框架怎么使用
      这篇文章主要讲解了“web分布式定时任务调度框架怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web分布式定时任务调度框架怎么使用”吧!一、业务背景1.1 为什么需要使用定时任务调度...
      99+
      2023-06-04
    • java分布式任务调度怎么实现
      实现Java分布式任务调度可以使用以下方法:1. 使用Quartz:Quartz是一个功能强大的开源任务调度框架,可以在Java应用...
      99+
      2023-10-23
      java
    • 怎么用SpringBoot实现动态添加定时任务功能
      这篇“怎么用SpringBoot实现动态添加定时任务功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用SpringBo...
      99+
      2023-06-29
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作