如何在Quartz中重新安排作业执行间隔?

时间:2012-09-04 06:36:39

标签: java quartz-scheduler

我对Quartz有点新意。有没有办法更新已提交的Quartz作业的作业执行间隔?此间隔是否立即更新?重新安排后,你是否必须再次开始工作?

我找到了以下链接,但我不知道哪些库是引用的代码,因为我的石英罐不包含链接中使用的某些类。此外,triggerKey方法来自哪里?这是某种静态导入吗?

http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/cookbook/UpdateTrigger.html

我希望在我的一个JUnit测试用例中将作业执行间隔更新为非常大的数字,因为我不希望作业干扰被测试类的状态。测试用例完成后,我想将作业执行间隔重置为将在生产中使用的实际值

2 个答案:

答案 0 :(得分:13)

您必须通过创建新触发器来重新安排作业。

public void execute(JobExecutionContext context) throws JobExecutionException {
    Trigger newTrigger = what_ever_you_want;
    Trigger oldTrigger = context.getTrigger();
    Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    scheduler.rescheduleJob(oldTrigger.getKey(), newTrigger);
}

这将使用新的触发器触发时间替换相同的作业。

答案 1 :(得分:0)

在Quartz库中某处也许有一个静态方法triggerKey()。但是,我设法重新调度了现有的Quartz作业(使用Quartz 2.3.2),而不使用此(潜在)方法,而是使用了TriggerKey类,如下所示:

    boolean updateExisting = true; // try it also with false
    int aveId = 1234; // change it as you wish
    java.util.Date closeDate = new java.util.Date(); // change it as you wish

    SchedulerFactory sf = new StdSchedulerFactory("... /quartz_priority.properties");
    Scheduler scheduler = sf.getScheduler();

    TriggerKey triggerKey = new TriggerKey("trigger" + aveId, "group1");

    if (updateExisting) {
        Trigger oldTrigger = scheduler.getTrigger(triggerKey);
        TriggerBuilder oldTriggerBuilder = oldTrigger.getTriggerBuilder();

        Trigger newTrigger = oldTriggerBuilder.startAt(closeDate).build();
        scheduler.rescheduleJob(triggerKey, newTrigger);

    } else {
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).startAt(closeDate).build();

        // Define job instance
        JobDetail job1 = JobBuilder.newJob(<YOUR_JOB_CLASS_NAME>.class).withIdentity("job" + aveId, "group1").build();

        JobDataMap map = job1.getJobDataMap();
        map.put(<PARAMETER_NAME>, aveId);

        // Schedule the job with the trigger
        scheduler.scheduleJob(job1, trigger);
    }