• Springboot结合Redis实现分布式定时任务


    一、背景

    之前分享过分布式定时任务的技术选型方案:分布式定时任务技术选型方案,个人青睐xxl_job,分享了搭建接入流程:xxl_job搭建方案,本次项目需求较为简单,同时时间紧张。下面介绍利用Redis锁实现分布式定时任务的方案。

    二、@Scheduled注解

    1. 利用@Scheduled注解实现定时任务,源码如下

    1. @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @Repeatable(Schedules.class)
    5. public @interface Scheduled {
    6. String cron() default "";
    7. String zone() default "";
    8. long fixedDelay() default -1;
    9. String fixedDelayString() default "";
    10. long fixedRate() default -1;
    11. String fixedRateString() default "";
    12. long initialDelay() default -1;
    13. String initialDelayString() default "";
    14. }

    2. 注解参数

     3. 示例

    cron

    @Scheduled(cron = "0/2 * * * * ?")

    从0秒开始,每隔两秒执行一次。

    zone

    @Scheduled(cron = "0/2 * * * * ?", zone = "GMT-8:00")

    从0秒开始,每隔两秒执行一次。

    指定时间使用的时区为东八区。

    fixedRate

    @Scheduled(fixedRate = 1000)

    1秒执行一次,上次执行开始后过1秒执行下一次。若到了1秒后但上次执行还未完成,会加入worker队列,等待上一次执行完成后,马上执行下一次。

    fixedRateString

    @Scheduled(fixedDelayString = "1000")
    @Scheduled(fixedDelayString = "PT1S")

    都表示1秒执行一次,上次执行开始后过1秒执行下一次。若到了1秒后但上次执行还未完成,会加入worker队列,等待上一次执行完成后,马上执行下一次。

    fixedDelay

    @Scheduled(fixedDelay = 1000)

    秒执行一次,上次执行完成后过1秒继续执行下一次。

    fixedDelayString

    @Scheduled(fixedDelayString = "1000")
    @Scheduled(fixedDelayString = "PT1S")

    都表示1秒执行一次,上次执行完成后过1秒继续执行下一次。

    initialDelay

    @Scheduled(initialDelay = 5000, fixedRate = 2000)

    首次5秒后执行,后续每隔2秒执行一次(遵循fixedRate 规则)

    @Scheduled(initialDelay = 5000, fixedDelay = 2000)

    首次5秒后执行,后续每隔2秒执行一次(遵循fixedDelay 规则)

    注意:initialDelay、initialDelayString都不能和cron一起使用

    initialDelayString

    @Scheduled(initialDelayString = "5000", fixedRate = 2000)

    首次5秒后执行,后续每隔2秒执行一次(遵循fixedRate 规则)

    @Scheduled(initialDelayString = "5000", fixedDelay = 2000)

    首次5秒后执行,后续每隔2秒执行一次(遵循fixedDelay 规则)

    注意:initialDelay、initialDelayString都不能和cron一起使用

    三、实现代码 

    1. 引入Redis

    1. <dependency>
    2. <groupId>org.redissongroupId>
    3. <artifactId>redissonartifactId>
    4. <version>3.13.5version>
    5. dependency>

    2. 定时任务执行类代码

    1. @Scheduled(cron = "0 0 23 * * ?")
    2. public void statistics() {
    3. RLock lock = redissonClient.getLock("cron_statistics");
    4. boolean lockResult = false;
    5. try {
    6. if (lockResult = lock.tryLock()) {
    7. log.info("每天23点执行一次任务开始!");
    8. }
    9. } catch (Exception e) {
    10. e.printStackTrace();
    11. log.error("每天23点执行一次任务失败{}", e);
    12. } finally {
    13. if (lock.isHeldByCurrentThread() && lockResult && lock != null) {
    14. lock.unlock();
    15. }
    16. }
    17. }

    3. 启动类增加注解

    @EnableScheduling

    如果有帮助,请多多点赞关注支持哦

  • 相关阅读:
    大二学生JavaScript实训大作业——动漫秦时明月7页 期末网页制作 HTML+CSS+JavaScript 网页设计实例 企业网站制作
    光环:研发云搭建及人才梯队建设——姚冬
    华为OD机试真题-补种未成活胡杨(Java/C++/Go/Python)
    轻松搭建本地知识库的ChatGLM2-6B
    《日期类》的模拟实现
    对接谷歌翻译接口的WordPressSEO插件
    Leetcode 891. 子序列宽度之和
    基于Vue+SpringBoot的高校学生管理系统 开源项目
    4 Kruskal算法的设计---来源王英S同学
    【K8S系列】第十讲:kubectl 命令大全
  • 原文地址:https://blog.csdn.net/xrq1995/article/details/127521054