如何配置Quartz来处理周期,周期和间隔

时间:2012-09-22 12:46:01

标签: java quartz-scheduler jobs

我正在为我的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. ...
  9. 显然,在配置代码的某个地方,我需要检查“间隔”是否达不到或超过“周期/周期”时间,否则我们有一个工作试图在它仍在运行时启动!

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

    理想情况下,如果Quartz可以处理这种行为,那么我只需要使用正确的句点/间隔设置配置1个monitor Job实现,然后将它们添加到Scheduler中。

    Quartz可以处理这个吗?如果是的话,怎么样(我能看到一个例子吗?!?)?如果没有,我有什么选择?提前谢谢!

2 个答案:

答案 0 :(得分:2)

实际上,Quartz触发器的工作方式完全符合您的要求:

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

无论你的工作有多长,这都会每15分钟发一次MemoryMonitorJob。当然,你可以让你的工作班保持两分钟(睡觉,循环等)。

如果您的工作超过15分钟,您有两种选择:

  • 默认情况下,Quartz将再次触发相同的作业,与之前的执行重叠。
  • 如果您的工作是有状态的,Quartz将不会再次触发工作,等待上一个工作完成。

答案 1 :(得分: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