【问题标题】:Spring Boot Job Scheduler fixedDelay and cronSpring Boot Job Scheduler fixedDelay 和 cron
【发布时间】:2019-02-17 05:09:54
【问题描述】:

我正在运行一个需要 5-10 秒才能完成的 Spring Boot 计划进程。完成后,60 秒后该过程再次开始(请注意,我没有使用 fixedRate):

@Scheduled(fixedDelay=60_000)

N 哦,我想限制它在周一至周五上午 9 点到下午 5 点每分钟运行一次。我可以做到这一点

@Scheduled(cron="0 * 9-16 ? * MON-FRI")

这里的问题是,它的行为类似于 fixedRate - 该过程每 60 秒触发一次,而不管完成上一次运行所花费的时间...

有什么方法可以结合这两种技术?

【问题讨论】:

  • 结合这两种技术是什么意思?你能解释一下你想要什么确切的行为吗?
  • 例如,调度程序应该在特定时间(例如上午 9 点到下午 5 点)被调用以选择特定的批次和进程。但是固定延迟的作用是在第一批完成处理后立即提取下一批进行处理,但这需要限制只能在上午 9 点到下午 5 点之间调用。
  • 我注意到当我启动一个已经在运行的 cron 时,它会再次运行。例如:我有一个需要 15 分钟的任务,但 cron 每 5 分钟执行一次。在数据库中,cron 获得运行状态,而其他计划的作业处于挂起状态。但 5 分钟后,另一个作业(使用相同的代码)也开始运行。所以现在我有同样的工作运行两次!所以为了避免我想使用 fixedDelay
  • 您可以做的是..在特定时间运行作业并在调用作业时创建时间戳文件,然后在运行下一个作业之前检查当前时间是否已超过时间戳的延迟。如果没有,则不要运行下一个作业。 (这是一种解决方法,但我想你不能通过 crontab 做到这一点)
  • 如果你知道你的工作大约需要 15 分钟,你不应该每 5 分钟运行一次 crons。

标签: java cron scheduler


【解决方案1】:

试试下面:

@Schedules({ 
  @Scheduled(fixedRate = 1000), 
  @Scheduled(cron = "* * * * * *")
})

【讨论】:

  • 至少需要 spring-context 4.0 但恕我直言,这应该是公认的答案。
猜你喜欢
  • 2021-04-25
  • 1970-01-01
  • 2017-06-14
  • 2021-06-14
  • 2013-12-31
  • 1970-01-01
  • 2014-02-01
  • 2011-07-25
  • 2021-04-07
相关资源
最近更新 更多