我们需要在 Java EE 服务器中执行调度作业,并且我们知道如何使用 Quartz 或 Timer 服务。
但我们的问题是,如果我们想更改生产计划或手动触发批处理,该怎么做?
在传统解决方案中,我们使用 servlet 来运行作业。然后使用带有 http 客户端(即 lynx)的 cronjob 来触发 servlet。它很容易实现,并且可以在生产中改变。
最佳答案
由于这个确切的问题,我从未发现计时器完全令人满意:您无法真正监视它们的状态或修改它们。
我推荐的是第二层作业管理器类。当您调用此类时,它会在时间“X”安排一个 Java EE 计时器,并且还记录您想要在时间“X”执行“作业”的事实。当时间到达时,Java EE 计时器会调用此作业管理器类,该类会找到作业并调用该作业。
这允许您编写一个“取消计划”函数。调用取消计划会删除该作业。当 Java EE 计时器在时间“X”调用时,此类未找到任何作业,因此会忽略它。
您还可以实现“更改计划”功能,删除旧条目,并在时间“Y”创建新条目,为时间“Y”安排 Java EE 计时器。 Java EE 计时器将在时间“X”到达,另一个在时间“Y”到达,但只有时间“Y”有效。
因此,手动触发只需让一个 servlet 立即调用“更改计划”即可。
另一个需要注意的细节:由于计时器事件并不完全可靠,因此我们实现此类来查找当前时间之前已安排的所有作业,并在该时刻运行所有作业。然后,我们每 5 分钟左右安排额外的 Java EE 计时器事件。这些计时器将接替因某种原因而被遗漏的所有工作。如果您的作业队列是持久的,这一点很重要,那么在重新启动服务器时,它可能恰好在计时器应该关闭的时刻关闭。没问题:Java EE 计时器事件本身没有任何意义,它们只是用于唤醒作业处理程序,以便它可以运行所有过时的作业。
关于java - 动态改变Timer服务或者Quartz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8243016/