2

我正在为我的 Java 后端编写一个监视器,并且需要能够在不同时间监视不同的事物(内存、CPU、用户活动、负载等)。最重要的是,我需要能够将每个监视器(MemoryMonitorJobCpuMonitorJobActivityMonitorJob等)配置为具有以下特性:

  • 定期打开/关闭(例如每 15 分钟一次)
  • 配置开机后的持续时间(例如 2 分钟)
  • 因此,我想配置,比如说,MemoryMonitorJob每 15 分钟启动一次,保持 2 分钟,然后关闭......但没有 2 分钟的间隔会抵消下一次运行的时间!

因此,在此特定示例下,监视器将表现出以下行为:

  1. t = 0,开启
  2. 0 < t < 2,运行
  3. t = 2,关闭
  4. t = 15,开启
  5. 15 < t < 17,运行
  6. t = 17,关闭
  7. t = 30,开启
  8. ...

显然,在配置代码的某处,我需要检查“间隔”是否满足或超过“周期/周期”时间,否则我们将有一项工作在它仍在运行时尝试启动!

我相信Quartz Scheduler是适合这里工作的工具,但我过去只使用它来设置简单的 cron 作业(“每 15 分钟运行一次 X ”)。这个间隔属性让我失望,在仔细查看 QuartzCronTriggerImpl文档后,我似乎无法弄清楚如何配置 Quartz 作业以使其表现得像这样。

理想情况下,如果 Quartz 可以处理这种行为,那么我只需Job使用正确的周期/间隔设置配置 1 个监视器实现,然后将它们添加到调度程序。

Quartz 能解决这个问题吗?如果是这样,如何(我可以看到一个例子吗?!?)?如果没有,我在这里有什么选择?提前致谢!

4

2 回答 2

2

实际上,Quartz 触发器完全按照您想要的方式工作:

Trigger trigger = newTrigger()
    .withSchedule(simpleSchedule()
        .withIntervalInMinutes(15)
        .repeatForever())
    .forJob(memoryMonitorJob)
    .build();

MemoryMonitorJob无论您的工作运行多长时间,它都会每 15 分钟触发一次。当然,让你的作业类运行两分钟(睡眠、循环等)取决于你

如果您的作业运行时间超过 15 分钟,您有两种选择:

  • 默认情况下,Quartz 将再次触发相同的作业,与之前的执行重叠。
  • 如果你的作业是有状态的,Quartz 不会再次触发作业,等待前一个作业完成。
于 2012-09-23T08:22:16.223 回答
0

我认为这里有几个选项,但最简单的方法是使用 CronTrigger 每 15 分钟运行一次作业,而不是跟踪作业内的 2 分钟。

工作代码

public void execute(JobExecutionContext context) throws JobExecutionException {
    Date now = new Date();
    Date inTwoMinutes = new Date(now.getTime() + 2*60*1000);
    while(inTwoMinutes.before(now)) {
        // do something
        now = new Date();
    }
}

调度代码

job = newJob(MyJob.class)
    .withIdentity("job", "group")
    .build();

trigger = newTrigger()
    .withIdentity("trigger", "group")
    .withSchedule(cronSchedule("0 15 * * * ?"))
    .build();

sched.scheduleJob(job, trigger);

这将每 15 分钟触发一次作业。

另一种选择是在第 15 分钟和第 16 分钟每秒触发相同的作业。在这种情况下,您不需要 while 循环。然而,不利的一面是,在工作之间保持状态更难。触发器看起来像这样。

trigger = newTrigger()
    .withIdentity("trigger", "group")
    .withSchedule(cronSchedule("* 15,16 * * * ?"))
    .build();

有关触发器的更多信息: http ://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger

于 2012-09-22T19:21:57.697 回答