我正在使用quartz框架来添加和安排作业和触发器。要求是为数据库中现有作业动态添加触发器。虽然我试图通过下面的代码实现这一点,但我得到的是org.quartz.ObjectAlreadyExistsException:无法存储Job:'EBP1.AAA',因为已存在此标识。 JobGroup EBP1的作业AAA已经进入数据库。我只是想为同一个工作添加新的触发器。请帮助如何实现这一目标。
String jobName = "AAA";
jobTrigger = jobName + "Trigger"+ (int )(Math.random() * 50 + 1);
String jobGroup = "EBP1";
JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(jobTrigger, jobGroup).storeDurably()
.build();
if (scheduler.checkExists(JobKey.jobKey(jobName, jobGroup))) {
System.out.println("Job exist");
} else {
System.out.println("New job");
scheduler.addJob(jobDetail, true);
}
CronTrigger trigger1 = (CronTrigger)(newTrigger().withIdentity(jobTrigger, jobGroup).withDescription("default description").forJob(jobDetail)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).startAt(futureDate(500, IntervalUnit.MILLISECOND)).build());
scheduler.scheduleJob(jobDetail, trigger1);
快速问题:示例代码是否与您获得异常的代码完全相同? 或者示例代码可能不完整,您需要更新它。
无论如何,我认为您当前的示例代码中存在一个错误:
- 使用触发器的标识创建“jobDetail”,而不是“jobName” - withIdentity(jobTrigger, jobGroup)
要向现有作业添加新触发器,请执行以下操作:
JobKey myJobKey = new JobKey(jobName, jobGroup);
CronTrigger trigger1 = (CronTrigger)(newTrigger().withIdentity(jobTrigger, jobGroup)
.withDescription("default description").forJob(myJobKey)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.startAt(futureDate(500, IntervalUnit.MILLISECOND))
.build());
scheduler.scheduleJob(trigger1);
用于双参数方法的JavaDoc scheduler.scheduleJob(JobDetail, Trigger)
清楚地说,
它会尝试根据提供的JobDetail创建作业
- 所以你得到ObjectAlreadyExistsException是有道理的
你能替换吗?
scheduler.scheduleJob(jobDetail, trigger1);
用下面再试一次
scheduler.scheduleJob(trigger1);