我正在为我的 Java 后端编写一个监视器,需要能够在不同时间监视不同的事物(内存、CPU、用户 Activity 、负载等)。最重要的是,我需要能够将每个监视器(MemoryMonitorJob
、CpuMonitorJob
、ActivityMonitorJob
等)配置为具有以下特征:
- 定期开启/关闭(例如每 15 分钟一次)
- 配置开机后保持多长时间(例如,2 分钟)
- 因此,我想将
MemoryMonitorJob
配置为每 15 分钟启动一次,持续 2 分钟,然后关闭...但没有那 2 分钟间隔抵消下一次运行的时间!
因此,在此特定示例下,监视器将表现出以下行为:
- t = 0,开启
- 0 < t < 2,运行
- t = 2,关闭
- t = 15,开启
- 15 < t < 17,跑
- t = 17, 关闭
- t = 30,开启
- ...
显然,在配置代码的某处,我需要检查“interval”是否满足或超过“period/cycle”时间,否则我们将有一个作业在它仍在运行时尝试启动!
我相信 Quartz Scheduler是这里工作的正确工具,但我过去只用它来设置简单的 cron 作业(“每 15 分钟运行 X”)。这个间隔属性让我失望,在仔细查看 Quartz CronTriggerImpl
文档后,我似乎无法弄清楚如何配置 Quartz 作业以实现这样的行为。
理想情况下,如果 Quartz 可以处理这种行为,那么我只需使用正确的周期/间隔设置配置 1 个监视器 Job
实现,然后将它们添加到调度程序。
Quartz 可以处理这个吗?如果是这样,如何(我可以看一个例子吗?!?)?如果没有,我在这里有什么选择?提前致谢!
最佳答案
实际上,Quartz 触发器完全按照您想要的方式工作:
Trigger trigger = newTrigger()
.withSchedule(simpleSchedule()
.withIntervalInMinutes(15)
.repeatForever())
.forJob(memoryMonitorJob)
.build();
这将每 15 分钟触发一次 MemoryMonitorJob
,无论您的作业运行多长时间。当然,让你的作业类保持运行两分钟( hibernate 、循环等)取决于你。
如果您的作业运行时间超过 15 分钟,您有两个选择:
- 默认情况下,Quartz 将再次触发相同的作业,与之前的执行重叠。
- 如果您的作业是有状态的,Quartz 将不会再次触发作业,等待前一个作业完成。
关于java - 如何配置 Quartz 来处理周期、周期和间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12543896/