当前位置:   article > 正文

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

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.redisson</groupId>
  3. <artifactId>redisson</artifactId>
  4. <version>3.13.5</version>
  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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/728140
推荐阅读
相关标签
  

闽ICP备14008679号