1. 问题描述:
  2.  
  3. 在集群模式部署服务端时,会出现所有的定时任务在各自的节点处均会执行一遍,这显然不符合实际的开发场景,针对这种问题,本文给出一种springboot集成shedlock的解决方案
  1. 第一步:引入相关包;
  1. <!-- 负载均衡定时任务执行一次 -->
  2. <dependency>
  3. <groupId>net.javacrumbs.shedlock</groupId>
  4. <artifactId>shedlock-spring</artifactId>
  5. <version>2.2.1</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>net.javacrumbs.shedlock</groupId>
  9. <artifactId>shedlock-provider-jdbc-template</artifactId>
  10. <version>2.2.1</version>
  11. </dependency>
  1. 注意:因为本公司的项目持久化采用的mysql数据库,所以引入的是JDBC数据库进行协调

  1. ShedLock还可以使用MongoRedisHazelcastZooKeeper等外部存储进行协调,例如使用redis则引入下面的包(只尝试过jdbc方式):
  1. <dependency>
  2. <groupId>net.javacrumbs.shedlock</groupId>
  3. <artifactId>shedlock-provider-redis-spring</artifactId>
  4. <version>2.5.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-data-redis</artifactId>
  9. </dependency>
  1. 针对不同的协调方式,相关的配置信息可参考https://www.jianshu.com/p/9c6791b617a7

第二步:向数据库中插入表shedlock;

CREATE TABLE shedlock(
NAME VARCHAR(64),
lock_until TIMESTAMP(3) NULL,
locked_at TIMESTAMP(3) NULL,
locked_by VARCHAR(255),
PRIMARY KEY (NAME)

)

第三步:在application.properties中添加数据库配置信息

  1. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
  2. spring.datasource.username=root1
  3. spring.datasource.password=root1

第四步:添加配置类

  1. import net.javacrumbs.shedlock.core.LockProvider;
  2. import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
  3. import net.javacrumbs.shedlock.spring.ScheduledLockConfiguration;
  4. import net.javacrumbs.shedlock.spring.ScheduledLockConfigurationBuilder;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.scheduling.TaskScheduler;
  8. import org.springframework.scheduling.annotation.EnableScheduling;
  9.  
  10. import javax.sql.DataSource;
  11. import java.time.Duration;
  12.  
  13. @Configuration
  14. @EnableScheduling
  15. public class ShedlockConfig {
  16.  
  17. @Bean
  18. public LockProvider lockProvider(DataSource dataSource) {
  19. return new JdbcTemplateLockProvider(dataSource);
  20. }
  21.  
  22. // @Bean
  23. // public TaskScheduler taskScheduler(){
  24. // return new MySpecialTask​​Scheduler();
  25. // }
  26.  
  27. @Bean
  28. public ScheduledLockConfiguration scheduledLockConfiguration(LockProvider lockProvider) {
  29. return ScheduledLockConfigurationBuilder
  30. .withLockProvider(lockProvider)
  31. .withPoolSize(10)
  32. .withDefaultLockAtMostFor(Duration.ofMinutes(10))
  33. .build();
  34. }
  35. }

第五步:在启动类上添加启动注解,否则SchedulerLock不会生效

  1. @EnableSchedulerLock(defaultLockAtMostFor = "PT50S")

第六步:添加@SchedulerLock到定时器业务方法入口

  1. private static final int TWENTY_NINE_MIN = 29 * 60 * 1000;
  1. @Scheduled(cron = "0 */30 * * * ?")
  2. @SchedulerLock(name = "scheduledTask", lockAtMostFor = TWENTY_NINE_MIN, lockAtLeastFor = TWENTY_NINE_MIN)
  3. public void scheduledTask() {
  4. // System.out.println(new Date() + "scheduledTask执行1次");
  5. }

参数解释:

  1. name属性:锁名称,必须指定,每次只能执行一个具有相同名字的任务,锁名称应该是全局唯一的;
  1. lockAtMostFor属性:设置锁的最大持有时间,为了解决如果持有锁的节点挂了,无法释放锁,其他节点无法进行下一次任务;
    lockAtMostForString属性:成功执行任务的节点所能拥有的独占锁的最长时间的字符串表达,例如“PT14M”表示为14分钟
  1. lockAtLeastFor属性:指定保留锁的最短时间。主要目的是在任务非常短的且节点之间存在时钟差异的情况下防止多个节点执行。这个属性是锁的持有时间。设置了多少就一定会持有多长时间,再此期间,下一次任务执行时,其他节点包括它本身是不会执行任务的
  1. lockAtLeastForString属性:成功执行任务的节点所能拥有的独占锁的最短时间的字符串表达,例如“PT14M”表示为14分钟

springBoot框架分布式部署定时任务重复执行之解决方案的更多相关文章

  1. Spring+quartz集群解决多服务器部署定时器重复执行的问题

    一.问题描述 Spring自带的Task虽然能很好使用定时任务,只需要做些简单的配置就可以了.不过如果部署在多台服务器上的时候,这样定时任务会在每台服务器都会执行,造成重复执行. 二.解决方案 Spr ...

  2. 小程序后端项目【Springboot框架】部署到阿里云服务器【支持https访问】

    前言: 我的后端项目是Java写的,用的Springboot框架.在部署服务器并配置https访问过程中,因为做了一些令人窒息的操作(事后发现),所以老是不能成功. 不成功具体点说就是:域名地址可以正 ...

  3. Laravel是怎样防止你的定时任务重复执行的

    基本介绍 有时候一个定时任务执行需要的时间可能会比我们想象的要长,这就会引起一个问题——当前任务还没有执行完毕的时候另一个相同的任务也会执行,从而导致任务重复.例如想象一下我们执行每分钟生成一次报告的 ...

  4. jemter分布式部署及linux下分布式脚本执行

    jmeter进行接口性能测试,占用内存较大,在模拟千万计并发用户时,使用分布式部署进行分压测试. 操作步骤:选择一台机器作为调度机,其他机器作为执行机 一.jmeter分布式部署 前提条件:A.执行机 ...

  5. 可重复执行的SQL Script

    问题 在工作中偶尔会遇到这样的问题:SQL script重复执行时会报错. 理想的状态下,SQL script跑一遍就够了,是不会重复执行的,但是实际情况往往很复杂. 比如Dev同学在开发时在A环境把 ...

  6. SpringBoot 使用定时任务动态执行任务

    import com.patient.core.adapter.CorsFilter; import org.mybatis.spring.annotation.MapperScan; import ...

  7. 【G】开源的分布式部署解决方案(一) - 开篇

    做这个开源项目的意义是什么?(口水自问自答,不喜可略过) 从功能上来说,请参考 预告篇,因自知当时预告片没有任何含金量,所以并没有主动推送到首页,而是私下的给一些人发的. 从个人角度上来说,我希望.n ...

  8. 【spring-boot】 springboot整合quartz实现定时任务

    在做项目时有时候会有定时器任务的功能,比如某某时间应该做什么,多少秒应该怎么样之类的. spring支持多种定时任务的实现.我们来介绍下使用spring的定时器和使用quartz定时器 1.我们使用s ...

  9. java Spring-Boot框架学习视频-百度云盘

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lk142500/article/deta ...

随机推荐

  1. .NET Core CSharp初级篇 1-5 接口、枚举、抽象

    .NET Core CSharp初级篇 1-5 本节内容类的接口.枚举.抽象 简介 问题 如果你需要表示星期或者是某些状态,使用字符串或者数字是否不直观? 你是否发现,无论何种电脑,它的USB口的设计 ...

  2. Linux C 网络编程——多线程的聊天室实现(服务器端)

    服务器端的主要功能: 实现多用户群体聊天功能(此程序最多设定为10人,可进行更改),每个人所发送的消息其他用户均可以收到.用户可以随意的加入或退出(推出以字符串"bye"实现),服 ...

  3. 《VR入门系列教程》之16---第一个OculusVR应用

    第一个VR应用    之前我们已经将Oculus的开发包导入到空工程中了,现在我们来构建第一个桌面VR的示例.开发包中已经有一个示例场景,只需要几步就可以让这个场景运行起来.我们将要构建的这个Demo ...

  4. [NLP-ASR] 语音识别项目整理(一) 语音预处理

      简介 之前参与过114对话系统的项目,中间搁置很久,现在把之前做过的内容整理一下,一是为自己回顾,二是也希望分享自己看的内容,中间也遇到一些问题,如果您可以提一些建议将不胜感激. 114查询主要分 ...

  5. HDU 多校 第三场 Fansblog

    代码千万条,规范第一条 训练赛的时候打表找规律,发现答案是1/(st-pre-1)!,奈何用错了模板,一直TLE到比赛结束,一直以为是卡什么输入输出或者是两个素数相差太大导致复杂度过高,读入优化啥的都 ...

  6. PID算法通俗理解,平衡车,倒立摆,适合不理解PID算法的人来看!

    先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线(PID资料再我的另一篇博客里) 倒立摆资料连接↓ https://www.cnblogs.com/LiuXinyu ...

  7. vue在窗口大小改变时强制刷新组件的方法

    mounted () { window.onresize = () => { return (() => { this.$forceUpdate(); })() } }

  8. WebGL简易教程(二):向着色器传输数据

    目录 1. 概述 2. 示例:绘制一个点(改进版) 1) attribute变量 2) uniform变量 3) varying变量 3. 结果 4. 参考 1. 概述 在上一篇教程<WebGL ...

  9. vue-cli中的跨域之proxytable

    为什么会有跨域? 浏览器有一个叫做同源策略的东西.同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的重要安全机制. 同源策略规定了如果两个页面的协 ...

  10. css公共样式 | 标签元素初始化

    PC参考样式1: @charset "utf-8"; html{background:#fff;overflow:auto;} body{min-width:1200px;font ...