如何更新一个预定的quartz任务?

4
以下两个片段都会产生此错误:

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);
4个回答

4

addJob()用于添加没有触发器的任务:如果这正是您想要的,只需在JobBuilder中调用storeDurably()即可;如果我猜测得正确,您希望在保留旧触发器的同时更新任务,则需要先检索现有触发器,然后如果触发器不需要更改,则使用scheduler.scheduleJob(newJob, oldTrigger);否则,使用TriggerBuilder.getTriggerBuilder();获取其构建器以创建副本,进行更改,并最终调用scheduler.scheduleJob(newJob, newTrigger)


3
对于我而言,scheduleJob() 函数会失败并显示“无法存储作业:'...',因为已经存在具有此标识的作业”。 - yurez

3
除了特定于工作的设置外,如果您正在使用Spring,则还应确保您的SchedulerFactoryBean具有overwriteExistingjobs = true。否则,只有作业的初始触发器/设置将被持久化(如果您正在持久化它们)。

2
对于非持久性工作,您必须使用具有3个参数的scheduler.addJob(job, true, true)。第三个参数告诉Quartz将作业(存储在RAM中)保存到调度之前,也就是直到您为其添加触发器为止:

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

storeNonDurableWhileAwaitingScheduling参数设置为true,可以存储非持久性作业。一旦它被调度,它将恢复正常的非持久性行为(即在没有剩余关联触发器的情况下被删除)。


0

这将有助于规避传统的职位更新方式。

  1. 首先使用 scheduler.deleteJob(jobKey(name,group)) 删除 现有的工作

  2. 然后使用 scheduler.scheduleJob(jobDetail,trigger,true) 安排新的工作。

用 try/catch(SchedulerEception se) 包围您的代码。

注意:在石英石属性中添加此属性 :) spring.quartz.overwrite-existing-jobs = true,否则调度程序将添加作业的新实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接