如何每周几天从 20.35 到 23.35 每 30 分钟运行一次作业?



我遇到了cron表达式的问题。 我必须从周四到周日每 30 分钟运行一次方法。时间将从20:35分钟到23:35分钟。

克龙表达式:

"0 35/30 20-23 ? * THU-SUN";

根据我的理解;我的方法将在周四 20:35 分钟每 30 分钟调用一次,直到周日。

我的期望:

方法将按照以下时间调用:

Thu May 19 20:35:00 IST 2016
Thu May 19 21:05:00 IST 2016
Thu May 19 21:40:00 IST 2016

但; 方法通过以下计时获取调用:

Thu May 19 20:35:00 IST 2016
Thu May 19 21:35:00 IST 2016
Thu May 19 22:35:00 IST 2016

谁能帮我。为什么每 1 小时评估一次 cron 表达式。??

下面是代码示例:

@Scheduled(cron="0 35/30 20-23 ? * THU-SUN")
public void startInboundSFTPChannel(){
logger.info("Cron job started....");
downloadSftpFilesController();
}

如果您希望命令从每天 20.35 运行到 23.35,从星期四到星期日,可以通过两个步骤定义它:

35   20    ? * THU-SUN
5-59 21-23 ? * THU-SUN

没有简单的方法可以在 cron 表达式中进行设置,因为您不希望它在 20.05 运行。

即:在 20 时,在 35 分钟运行。在21至23小时,每30分钟一次,偏移5分钟。


我的答案基于这种格式:

+---------------- minute (0 - 59)
|  +------------- hour (0 - 23)
|  |  +---------- day of month (1 - 31)
|  |  |  +------- month (1 - 12)
|  |  |  |  +---- day of week (0 - 6) (Sunday=0 or 7)
|  |  |  |  |
*  *  *  *  *  command to be executed 

据我了解,您的表达式(0 35/30 20-23 ? * THU-SUN)的意思是:

  • 0- 仅以整分钟运行,
  • 35/30- 每 30 分钟运行一次,从 35 开始,
  • 20-23- 运行时间在 20 到 23 之间,
  • ?- 使用表达式后面部分的隐含日,
  • *每个月运行,
  • THU-SUN- 在周四、周五、周六和周日运行。

因此,当您指定一个增量而不是两个值时,Quartz(Spring 使用)尝试像下面这样计算它:

  • 首先,它计算分钟35的值 - 与条件匹配0-59
  • 其次,它为以前的35(等于65)增加了30与条件不匹配的内容0-59
  • 最后,唯一正确的值是35

因此,它每小时运行一次您的代码,当分钟==35

你能处理在Thu May 19 20:05:00 IST 2016再次运行代码吗?

如果是,则可以使用以下表达式之一:

  1. 0 5,35 20-23 ? * THU-SUN

这意味着:

  • 0- 仅在整分钟运行时运行,
  • 5,35- 每 30 分钟运行一次,从分钟 == 5 开始,
  • 20-23- 运行时间在 20 到 23 之间,
  • ?- 使用表达式后期的隐含天数,
  • *- 每月运行一次,
  • THU-SUN- 周四、周五、周六和周日运行。

    1. 0 5/30 20-23 ? * THU-SUN

这意味着:

  • 0- 仅在整分钟运行时运行,
  • 5/30- 从分钟== 5开始每30分钟运行一次,
  • 20-23- 运行时间在 20 到 23 之间,
  • ?- 使用表达式后面部分的隐含日,
  • *- 每月运行一次,
  • THU-SUN- 在周四、周五、周六和周日运行。

在这里你可以找到类似的问题。

最新更新