[英]How do update a scheduled quartz Job?
以下两个片段都给出了这个错误:
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);
addJob()
用于添加没有附加触发器的作业:如果这是您想要的,只需向storeDurably()
添加对storeDurably()
的调用; 如果,正如我只能猜测,您想在保留旧触发器的同时更新作业,则需要先检索现有触发器,然后,如果触发器不需要更改, scheduler.scheduleJob(newJob, oldTrigger)
; 否则使用TriggerBuilder.getTriggerBuilder();
为其获取构建器TriggerBuilder.getTriggerBuilder();
构建副本,进行更改,并最终调用scheduler.scheduleJob(newJob, newTrigger)
。
除了特定于作业的设置之外,如果您使用的是 Spring,您还应该确保您的SchedulerFactoryBean
具有overwriteExistingjobs = true
。 否则,只会保留作业的初始触发器/设置(如果您要保留它们)。
对于非持久作业,您必须使用scheduler.addJob(job, true, true)
代替,带有 3 个参数。 第三个参数告诉 Quartz 将作业存储(在 RAM 中)直到它被调度,也就是直到你为它添加触发器:
void addJob(JobDetail jobDetail, boolean replace, boolean storeNonDurableWhileAwaitingScheduling) throws SchedulerException
将
storeNonDurableWhileAwaitingScheduling
参数设置为true
,可以存储非持久作业。 一旦被调度,它将恢复正常的非持久行为(即一旦没有剩余的关联触发器就被删除)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.