6

我对石英有点陌生。有没有办法更新已经提交的 Quartz 作业的作业执行间隔?这个间隔会立即更新吗?重新安排工作后是否必须重新开始工作?

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

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

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

4

2 回答 2

21

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

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);
}

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

于 2012-12-28T02:08:49.420 回答
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);
    }
于 2020-04-05T05:19:15.467 回答