动态更改定时器服务或Quartz

时间:2011-11-23 13:31:13

标签: java java-ee timer quartz-scheduler

我们需要Java EE服务器中的计划作业,并且我们知道如何使用Quartz或Timer服务。

但我们的问题是,如果我们想要改变生产计划或手动触发批次,该怎么做?

在传统解决方案中,我们使用servlet来运行作业。然后使用带有http客户端(即lynx)的cronjob来触发servlet。它易于实施,可能会改变生产。

1 个答案:

答案 0 :(得分:0)

由于这个确切的问题,我从未发现计时器完全令人满意:你无法真正监控他们的状态或修改它们。

我推荐的是第二层作业管理器类。当您调用此类时,它会为时间“X”调度Java EE计时器,并且还会记录您希望在时间“X”执行“作业”的事实。当该时间到来时,Java EE计时器调用此作业管理器类,该类找到该作业,并调用该作业。

这允许你做的是写一个“非计划”功能。调用非计划将删除该作业。当Java EE计时器在时间'X'调用时,该类找不到任何作业,因此忽略它。

您还可以实现一个“更改计划”功能,删除旧条目,并在'Y'时间创建一个新条目,为Java EE计时器安排时间'Y'。 Java EE计时器将在时间“X”和“Y”时间到达,但只有时间“Y”才会生效。

因此,手动触发是指将servlet称为“变更计划”的问题。

要注意的另一个细节:因为计时器事件不是完全可靠的,我们实现此类以查找在当前时间之前已调度的所有作业,并在此时运行所有这些作业。然后,我们每隔5分钟左右安排额外的Java EE计时器事件。那些计时器将会因为某种原因而被遗弃的任何工作。如果您的作业队列是持久的,那么这很重要,那么可能是在重新启动服务器时,它恰好在计时器应该关闭的那一刻就停止了。没问题:Java EE Timer事件本身没有任何意义,它们只是用来唤醒作业处理程序,因此它可以运行所有过时的作业。