【问题标题】:Java Quartz Cron TriggerJava Quartz Cron 触发器
【发布时间】:2010-09-02 13:10:47
【问题描述】:

我在我的 java 程序中使用了 Quartz Cron 触发器。我使用的 Cron 表达式是 0 0 * * * ?

现在我想要一个调度程序每小时执行一次。为了测试同样的启动我的 jboss 服务器,然后我将我的 windows 时间重置为 5:59:45 和 6:00:00 调度程序没有触发。

现在下次我第一次将时间调整为 5:55:00,然后我启动服务器,发现调度程序在 6:00:00 触发。

服务器或调度程序是否在内部维护时间,当然最初是使用系统时间初始化的??

【问题讨论】:

  • 您是否将事件存储在数据库中?

标签: java quartz-scheduler crontrigger


【解决方案1】:

根据 Quartz CronTrigger source code,触发器会保留下一次触发的日期。

我想如果你在 6:15:00 启动服务器,Quartz 会保留 7:00:00 作为下一次启动时间。将服务器时间更改为 5:55:45 不会更新下一次触发时间,并保留 7:00:00 作为下一次触发时间。所以事件不会在 6:00:00 触发,而是在 7:00:00 触发。

因此,时间不会直接保留,但会保留触发时间,并且如果您更改系统时钟,它似乎不会更新。

【讨论】:

    【解决方案2】:

    如果您使用 JDBC 作业存储,quartz 会每隔一分钟检查一次数据库,以使用当前系统时间来查找当前要运行的作业。

    当您向前移动系统时间时,quartz 将在下次检查时触发适当的作业(即在几分钟内)。

    【讨论】:

    • 这也是我的理解,我使用了 jdbc jobStore,但如果我将系统时间向前移动,触发器不会触发。如果你有很好的理解,请在这里回答:stackoverflow.com/questions/40245113/…
    【解决方案3】:

    我也遇到了同样的问题,这个问题的解决方法是:

    表达式表示 0 0 * * * ?即秒、分钟、小时、月中的某天、月、周中的某天。所以在每一天、每个月、每个星期以及任何一年的每一个小时的开始都开火。

    这个表达式只是说明你想在每小时开始时触发你的工作,因此它会记录你的服务器启动之前的时间,因此如果在服务器启动之前时间传递到任何小时时间,那么它将在下一次触发小时时间例如-

    1 .您在 5:55 启动服务器,但服务器启动需要 7 分钟,因此时间比 6:00 多 2 分钟,所以下一次启动时间将是 7:00

    2 。但是,如果您的服务器在 5:59:59 成功启动,那么它肯定会在 6:00 触发,因为调度程序应该在每小时开始运行并且服务器在 6:00 时钟之前准备好。

    注意:服务器启动后在 windows 上更改时间不会使调度程序运行,因为时间是由服务器运行时间记录的。

    【讨论】:

      【解决方案4】:

      支持 Vivien Barousse 的回答,quartz 将存储每个触发器的下一次触发时间。如果您使用 JDBC JobStore,您可以在数据库中找到一个类似于 *_QRTZ_TRIGGERS 的表,并且 COLUMN NEXT_FIRE_TIME 以时间戳格式存储下一次触发时间。

      【讨论】:

      • 您能否为您的答案添加一些解释?
      • 嗨@Cray,只是更新答案,我希望它会帮助你理解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      相关资源
      最近更新 更多