我在我的 java 程序中使用 Quartz Cron 触发器。我使用的 Cron 表达式是 0 0 * * * ?
现在我想要一个调度程序每小时执行一次。为了测试同样的启动我的 jboss 服务器,然后我将我的 windows 时间重置为 5:59:45 和 6:00:00 调度程序没有触发。
现在,下一次我第一次将时间调整为 5:55:00,然后我启动了服务器,发现调度程序在 6:00:00 触发。
服务器或调度程序是否在内部维护时间,当然最初是使用系统时间初始化的?
我在我的 java 程序中使用 Quartz Cron 触发器。我使用的 Cron 表达式是 0 0 * * * ?
现在我想要一个调度程序每小时执行一次。为了测试同样的启动我的 jboss 服务器,然后我将我的 windows 时间重置为 5:59:45 和 6:00:00 调度程序没有触发。
现在,下一次我第一次将时间调整为 5:55:00,然后我启动了服务器,发现调度程序在 6:00:00 触发。
服务器或调度程序是否在内部维护时间,当然最初是使用系统时间初始化的?
根据 Quartz CronTrigger source code,触发器保留下次触发的日期。
我想如果你在 6:15:00 启动服务器,Quartz 会保留 7:00:00 作为下一个触发时间。将服务器时间更改为 5:55:45 不会更新下一次触发时间,并且将 7:00:00 保留为下一次触发时间。所以事件不会在 6:00:00 触发,而是在 7:00:00 触发。
因此,不会直接保留时间,但会保留触发时间,并且如果您更改系统时钟,它似乎不会更新。
如果您使用 JDBC 作业存储,quartz 会每隔一分钟检查一次数据库,使用当前系统时间来查找要运行的作业。
当您向前移动系统时间时,quartz 将在下一次检查时触发适当的作业(也就是说,在几分钟内)。
我也遇到了同样的问题,这个问题的解决方案是:
表达式表示 0 0 * * * ? 即秒、分钟、小时、月中的某天、月、周中的某天。因此,在每一天、每个月、每个星期以及无论是哪一年的每一个小时的开始都开火。
这个表达式只是说明你想在每小时开始时解雇你的工作,所以它会记录你的服务器启动之前的时间,因此如果在服务器启动之前时间传递到任何一个小时的时间,那么它将在下一个小时的时间触发,例如-
1. 您在 5:55 启动服务器,但服务器需要 7 分钟才能启动,因此时间比 6:00 多 2 分钟,因此下一次启动时间将是 7:00
2. 但是,如果您的服务器在 5:59:59 成功启动,那么它肯定会在 6:00 触发,因为调度程序应该在每小时开始时运行,并且服务器在 6:00 时钟之前准备好。
注意:服务器启动后在 Windows 上更改时间不会使调度程序运行,因为时间由服务器运行时间记录。
支持 Vivien Barousse 的回答,石英将存储每个触发器的下一次触发时间。如果您使用 JDBC JobStore,您可以在数据库中找到一个类似于 *_QRTZ_TRIGGERS的表,并且 COLUMN NEXT_FIRE_TIME以时间戳格式存储下一次触发时间。