我正在使用石英框架来添加和安排作业和触发器。要求是为数据库中已经存在的作业动态添加触发器。当我尝试使用以下代码实现此目标时,我遇到org.quartz.ObjectAlreadyExistsException:无法存储Job:“ EBP1.AAA”,因为该标识已经存在。具有JobGroup EBP1的Job 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);
答案 0 :(得分:1)
快速提问:示例代码与您从中获得异常的代码完全相同吗?
或者示例代码不完整,您需要对其进行更新。
无论如何,我认为您当前的示例代码中有一个错误:
-您使用触发器的身份而非“ jobName”创建“ jobDetail”-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);
用于2参数方法的JavaDoc scheduler.scheduleJob(JobDetail, Trigger)
清楚地表示,
它将根据提供的JobDetail 尝试创建该作业
-因此您为什么会收到ObjectAlreadyExistsException
答案 1 :(得分:0)
您可以替换
scheduler.scheduleJob(jobDetail, trigger1);
使用以下内容,然后重试
scheduler.scheduleJob(trigger1);
答案 2 :(得分:0)
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity(trigger.getName(),trigger.getGroup())
.withSchedule(cronScheduleBuilder)
.forJob(trigger.getJobName(),trigger.getJobGroup())
.build();
scheduler.scheduleJob(cronTrigger);