【问题标题】:Spring cron scheduler for every 59 seconds do double runSpring cron 调度程序每 59 秒执行一次双重运行
【发布时间】:2022-02-10 16:44:56
【问题描述】:

我需要我的任务从上午 9 点到下午 6 点每 59 秒运行一次,我的意思不是每分钟的 59 秒,而是上一次运行结束后的 59 秒。所以我为我的调度程序设置了这样一个 cron */59 * 9-21 * * *

有代码

@Scheduled(cron = "*/59 * 9-21 * * *")
public void schedule() {
    try {
        log.info("Scheduler starts!");
    } catch (Exception e) {
        log.error("Error was caught in scheduler", e);
    }
}

这就是我在日志中看到的:

2022-02-09 16:01:00.002 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:01:59.002 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:02:00.001 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:02:59.002 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:03:00.002 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:03:59.001 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:04:00.001 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:04:59.002 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:05:00.001 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:05:59.002 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:06:00.001 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:06:59.002 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!
2022-02-09 16:07:00.001 | spring-vault-ThreadPoolTaskScheduler-1 | INFO  | com.app.MyScheduler             [ / ] -       Scheduler starts!

为什么它会以这种方式工作并在每分钟的 59 秒和 00 秒重复运行?我的 cron 错了吗?

更新: 我正在使用 grails 4.0.1

【问题讨论】:

  • 我不确定是否可以使用 cron 表达式。 fixedRate = 59 是一个选项吗?
  • 但是是否可以在固定利率中设置从上午 9 点到下午 6 点的范围?因为我现在不是,这就是我选择 cron 的原因
  • 你的 cron 表达式没问题。您可以使用以下方法对其进行测试: var expression = CronExpression.parse("*/59 * 9-21 * * *"); var 结果 = 表达式.next(LocalDateTime.now()); System.out.println(结果);

标签: java spring cron scheduled-tasks


【解决方案1】:

我认为调度程序中存在错误。

使用下面的测试代码你会看到当当前时间在 00 秒 59 秒时发生了 2 次调度。

  Set<String> x = new HashSet<>();
    List<LocalDateTime> y = new ArrayList<>();
    while (true) {

      var expression = CronExpression.parse("*/59 * 9-21 * * *");
      final LocalDateTime now = LocalDateTime.now();
      y.add(now);
      x.add(expression.next(now).toString());
      System.out.println(x);
      Thread.sleep(500);

      if (x.size() > 2){
        break;
      }
    }

    System.out.println(x);

我得到了 3 个结果

[2022-02-09T15:58:59, 2022-02-09T15:59:59, 2022-02-09T15:59]

以下日期:

我已经用 Spring Boot 2.6.3 版对此进行了测试。

【讨论】:

  • 那么,这个 bug 与 Spring 有关吗?有没有办法解决它?顺便说一句,我正在使用 grails 4.0.1
  • 我应该添加什么依赖项来使用 CronExpression.parse?我的项目中没有 CronExpression 类
  • 我猜你必须在 Spring 问题跟踪器中打开一个错误。依赖:spring-context (5.3.15).
猜你喜欢
  • 1970-01-01
  • 2012-03-26
  • 2019-06-06
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2015-07-29
  • 2018-03-22
  • 2018-02-18
相关资源
最近更新 更多