java - 动态改变Timer服务或者Quartz

标签 java jakarta-ee timer quartz-scheduler

我们需要在 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/

相关文章:

java - 如何检查 2 秒内发生了多少事件? (定时器)

c++ - sockets和timer如何互不阻塞地使用?

java - 如何在 Java 中为 Salted-Hash 生成 SALT?

jakarta-ee - 所有 Java EE 规范的摘要

java - EJB bean 和 CDI bean 以及注入(inject)

java - 在哪里可以找到 ConnectivityMonitor()?

java - 用于显示 JPanel 列表的组件/布局管理器

java - Random.nextInt 返回连续的相同值整数(经常)

Java 自己制作 System.out

android - 带回调的定时器