如何更新预定的石英作业?

时间:2017-06-06 21:15:11

标签: java quartz-scheduler

以下两个代码段都会出现此错误:

  

org.quartz.SchedulerException:添加了没有触发器的作业必须是   耐用。

  JobDetail job = scheduler.getJobDetail(jobKey(jobInfo));
  job.getJobDataMap().put(JOB_CONTENT, objectMapper.writeValueAsString(jobInfo));
  scheduler.addJob(job, true);


  JobDetail job = JobBuilder
        .newJob(MyJob.class)
        .usingJobData(JOB_CONTENT, objectMapper.writeValueAsString(jobInfo))
        .withIdentity(jobKey(jobInfo))
        .build();
  scheduler.addJob(job, true);

3 个答案:

答案 0 :(得分:2)

addJob()用于添加没有附加触发器的作业:如果这是您想要的,只需将storeDurably()的调用添加到JobBuilder;如果,我只能猜测,你想在保留旧触发器的同时更新作业,则需要先检索现有的触发器,然后,如果触发器不需要更改,scheduler.scheduleJob(newJob, oldTrigger);否则使用TriggerBuilder.getTriggerBuilder();获取构建器来构建副本,进行更改,最后调用scheduler.scheduleJob(newJob, newTrigger)

答案 1 :(得分:0)

对于非持久性作业,您必须使用scheduler.addJob(job, true, true)代替3个参数。第三个参数告诉Quartz存储作业(在RAM中)直到它被调度,直到你为它添加一个触发器:

  

void addJob(JobDetail jobDetail, boolean replace, boolean storeNonDurableWhileAwaitingScheduling) throws SchedulerException

     

storeNonDurableWhileAwaitingScheduling参数设置为true,可以存储非持久作业。一旦安排好,它将恢复正常的非持久行为(即一旦没有剩余的相关触发器就被删除)。

答案 2 :(得分:0)

除了特定于工作的设置外,如果您使用的是Spring,还应确保std::terminate具有private static void reverseStack(Stack<Integer> stack) { for (int i = 0, mid = stack.size() >> 1, j = stack.size() - 1; i < mid; i++, j--) stack.set(i, stack.set(j, stack.get(i))); } 。否则,将仅保留作业的初始触发器/设置(如果要保留它们)。