【问题标题】:Cron expression to be executed every 45 minutes每 45 分钟执行一次 Cron 表达式
【发布时间】:2015-03-16 10:41:59
【问题描述】:

我想要一个每 45 分钟触发一次的 cron 表达式。

根据文档,我创建了这个0 0/45 * * * ? 表达式。

但它以 12:00、12:45、13:00、13:45、14:00 等模式触发。

但我期望和想要的是在 12:00、12:45、13:30、14:15 被解雇。

我错过了什么?

【问题讨论】:

    标签: cron quartz.net


    【解决方案1】:

    Cron 并非旨在解决此类问题。它定义了必须触发触发器的确切日期和时间,而不是时间间隔。请改用简单的时间表:

    TriggerBuilder.Create()
      .StartAt(startDate)
      .WithSimpleSchedule(
        simpleScheduleBuilder => simpleScheduleBuilder.WithIntervalInMinutes(45))
      .Build();
    

    编辑: 可以是上面的简单调度,也可以是多个 cron 触发器(Quartz 作业可以有多个触发器):

    0 0/45 12/3 * * ?    # 12:00, 12:45, 15:00, 15:45, ...
    0 30 13/3 * * ?      # 13:30, 16:30, ...
    0 15 14/3 * * ?      # 14:15, 17:15, ...
    

    【讨论】:

    • 不幸的是,我正在增强一个项目,以前的开发人员没有实现对简单时间表的支持。添加对简单日程的支持对我来说工作量太大了。
    • 我已经编辑了答案。我看不出有任何方法可以使用单个 cron 触发器。
    【解决方案2】:

    0 0/45 * * * ? 实际上的意思是“每 45 分钟开火一次,从每小时的第 0 分钟开始”。

    您声称您当前的输出是 12:00, 12:45, 13:00, 13:45, 14:30,除了最后一次是 14:30 之外,这是有道理的。

    该作业在一小时开始 (12:00) 触发,45 分钟后再次触发 (12:45),然后重复,从第 0 分钟 (13:00) 开始触发下一个作业,然后在整点 45 分钟 (13:45) 再次触发。

    我不确定为什么它会在 14:30 突然开始触发,但如果你将 cron 输入更改为

    0 45 * * * ?我相信它会按照你的意愿工作,每 45 分钟发射一次。

    【讨论】:

    • 14:30 写错了。我已经修好了。感谢您指出。但是你的老太婆也不工作。它会在 11:45, 12:45, 1:45, 2:45 ... 产生这种模式......似乎没有办法解决它,唯一的解决方案是使用简单的时间表。
    【解决方案3】:

    这是一种可能对您有所帮助的解决方法。每 15 分钟创建一个计时器

    0 0/15 * * * ? *
    

    并保留一个充当计数器的变量,并在每次触发计时器时递增。当计数器达到 3 时,触发您的方法并将计数器重置为 0。希望这对来到这里寻找答案的人有所帮助!

    【讨论】:

      【解决方案4】:

      如果需要,您可以将间隔更改为 */15。但这实际上每 45 分钟运行一次:

      * * * * * (( $(( $(date '+(\%M+\%H*60)')\%45 )) )) || date >> /tmp/cron_45.out 2>&1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-18
        • 2012-01-23
        • 2023-04-01
        • 1970-01-01
        • 2014-08-07
        • 1970-01-01
        • 2016-12-25
        • 2013-01-09
        相关资源
        最近更新 更多