2010-09-02 59 views
1

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

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

现在下次我第一次调整时间说5:55:00,然后我启动了服务器,并在6:00:00启动调度器。

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

+0

您是否将事件存储在数据库中? – khmarbaise 2010-09-02 13:16:43

回答

5

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

我想如果你在6点15分开始服务器,Quartz会保留7:00:00作为下一次点火时间。将服务器时间更改为5:55:45不会更新下一次开火时间,并且7:00:00将保留为下一次开火时间。因此,事件不会在6:00:00开始,而是在7:00:00开始。

因此,时间不会被直接保留,但会保留开火时间,而且如果您更改系统时钟,则不会更新开火时间。

1

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

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

+0

这也是我的理解,我使用jdbc jobStore,但如果我将系统时间向前移动,则触发器不会触发。如果你有一个很好的理解,请在这里回答:https://stackoverflow.com/questions/40245113/quartz-scheduler-testing-scenario-not-working – Gurkha 2016-10-25 16:49:54

0

我也面临同样的问题,解决这个问题是:

表述是指0 0 * * *?即秒,分,小时,月,月,星期几。所以在每一天,每个月,每一周的每一个小时的开始,以及无论是哪一年。

这个表达式只是声明你想在你的服务器启动之前记录下你的工作和每个小时的时间,因此如果在服务器启动时间到达任何小时的时间之前,它会触发下一小时时间例如 -

1。您在5:55启动服务器,但服务器花了7分钟启动,因此时间超过6:00超过2分钟,因此下一次启动时间将为7:00

2。但是如果你的服务器在5:59:59成功启动,那么肯定会在6点启动,因为调度程序应该在每个小时的开始时运行,服务器在6点钟之前就准备好了。

注意:在服务器启动后,在窗口上更改时间不会使时间表运行,因为时间服务器运行时会记录时间。