• 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

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

  • 相关阅读:
    【4.1 统计学基本概念】(描述性统计分析)——CDA
    04. 组合总和
    谁家的加密密钥,写死在代码里?(说的就是你)
    软件测试的一些心得和建议
    两个队列实现一个栈
    k8s管理工具kubectl详解(一)
    Jira系统基本介绍
    【学习笔记】线程池
    【Oracle】Oracle系列之三--Oracle字符集
    1天精通Apipost--全网最全gRPC调试和智能Mock讲解!
  • 原文地址:https://blog.csdn.net/xrq1995/article/details/127521054