如何在每30分钟,每周几天从20.35到23.35办一份工作?

时间:2016-05-19 10:04:00

标签: java cron cronexpression

我面临着cron表达式的问题。 我必须每隔30分钟从周四到周日运行一种方法。时间从20:35开始到23:35分钟。

Cron表达:

"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

任何人都可以帮助我。为什么cron表达每1小时进行一次评估。??

以下是代码示例:

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

2 个答案:

答案 0 :(得分:2)

如果您希望命令从星期四到星期日每天从20.35运行到23.35,则可以分两步进行定义:

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

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

即:在20,在分钟35运行。在21至23小时,every 30 minutes with an offset of 5 minutes

我的答案基于这种格式:

 +---------------- 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 

答案 1 :(得分:1)

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

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

因此,当你指定一个增量而不是两个值Quartz(Spring使用它)时,会尝试对此进行计算,如下所示:

  • 首先,它计算分钟的值35 - 与0-59条件匹配的内容,
  • 第二,它将30添加到上一个35(等于65)与0-59条件不匹配的内容,
  • 最后,唯一正确的值是35

因此,当分钟== 35时,它会每隔一小时运行一次代码。

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

如果是,那么您可以使用以下表达式之一:

  1. 0 5,35 20-23 ? * THU-SUN
  2. 这意味着:

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

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

    这意味着:

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

    Here你可以找到类似的问题。