Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何配置Quartz以处理周期、周期和间隔_Java_Quartz Scheduler_Jobs - Fatal编程技术网

Java 如何配置Quartz以处理周期、周期和间隔

Java 如何配置Quartz以处理周期、周期和间隔,java,quartz-scheduler,jobs,Java,Quartz Scheduler,Jobs,我正在为我的Java后端编写一个监视器,需要能够在不同的时间监视不同的东西(内存、CPU、用户活动、负载等)。最重要的是,我需要能够配置每个监视器(MemoryMonitorJob,CpuMonitorJob,ActivityMonitorJob,等等),使其具有以下特征: 定期打开/关闭(如每15分钟一次) 配置开机后的开机时间(例如,2分钟) 因此,我想将MemoryMonitorJob配置为每15分钟启动一次,持续2分钟,然后关闭…,但这2分钟的间隔不会抵消下次运行之前的时间 因此,在

我正在为我的Java后端编写一个监视器,需要能够在不同的时间监视不同的东西(内存、CPU、用户活动、负载等)。最重要的是,我需要能够配置每个监视器(
MemoryMonitorJob
CpuMonitorJob
ActivityMonitorJob
,等等),使其具有以下特征:

  • 定期打开/关闭(如每15分钟一次)
  • 配置开机后的开机时间(例如,2分钟)
  • 因此,我想将
    MemoryMonitorJob
    配置为每15分钟启动一次,持续2分钟,然后关闭…,但这2分钟的间隔不会抵消下次运行之前的时间
因此,在此特定示例下,监控器将显示以下行为:

  • t=0,打开
  • 0
  • t=2,关闭
  • t=15,打开
  • 15
  • t=17,关闭
  • t=30,打开
  • 显然,在配置代码中的某个地方,我需要检查“interval”是否满足或超过“period/cycle”时间,否则我们将在作业仍在运行时尝试启动它

    我相信,对于这里的作业来说,是正确的工具,但我过去只在设置简单的cron作业时使用过它(“每15分钟运行X”)。这个interval属性让我很反感,在仔细查看Quartz
    CronTriggerImpl
    文档之后,我似乎不知道如何将Quartz作业配置为这样

    trigger = newTrigger()
        .withIdentity("trigger", "group")
        .withSchedule(cronSchedule("* 15,16 * * * ?"))
        .build();
    
    理想情况下,如果Quartz能够处理这种行为,那么我只需配置1个监视器
    作业
    实现,并使用正确的周期/间隔设置,然后将它们添加到调度器中


    石英能处理吗?如果是,如何(我可以看到一个例子?!?)?如果没有,我的选择是什么?提前谢谢

    我认为这里有几个选项,但最简单的方法是使用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();
    
    有关触发器的详细信息:

    实际上,石英触发器的工作方式正是您想要的:

    Trigger trigger = newTrigger()
        .withSchedule(simpleSchedule()
            .withIntervalInMinutes(15)
            .repeatForever())
        .forJob(memoryMonitorJob)
        .build();
    
    无论您的作业运行多长时间,它都会准确地每隔15分钟触发一次
    MemoryMonitorJob
    。当然,让你的作业课持续两分钟(睡觉、循环等)取决于你

    如果作业运行时间超过15分钟,则有两个选项:

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

    您能定义一下“开启”是什么意思吗?你的意思是,它将是一个可以运行2分钟以上的作业,还是它将重复做同样的事情2分钟?好的一点:-)通过“打开”,代码流将进入一个“无限”
    ,而(真){…}
    循环,并继续重复做同样的事情,直到“间隔”(即2分钟)结束。对不起,我没有澄清!