我对Quartz有点新意。有没有办法更新已提交的Quartz作业的作业执行间隔?此间隔是否立即更新?重新安排后,你是否必须再次开始工作?
我找到了以下链接,但我不知道哪些库是引用的代码,因为我的石英罐不包含链接中使用的某些类。此外,triggerKey方法来自哪里?这是某种静态导入吗?
http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/cookbook/UpdateTrigger.html
我希望在我的一个JUnit测试用例中将作业执行间隔更新为非常大的数字,因为我不希望作业干扰被测试类的状态。测试用例完成后,我想将作业执行间隔重置为将在生产中使用的实际值
答案 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);
}