1

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

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

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

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

4

4 回答 4

6

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

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

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

于 2010-09-02T14:14:38.297 回答
1

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

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

于 2011-02-03T13:51:23.523 回答
1

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

表达式表示 0 0 * * * ? 即秒、分钟、小时、月中的某天、月、周中的某天。因此,在每一天、每个月、每个星期以及无论是哪一年的每一个小时的开始都开火。

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

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

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

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

于 2012-09-04T13:09:42.347 回答
0

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

于 2019-07-03T10:55:25.767 回答