石英为现有作业添加触发器

时间:2019-04-09 06:14:46

标签: java quartz-scheduler job-scheduling quartz crontrigger

我正在使用石英框架来添加和安排作业和触发器。要求是为数据库中已经存在的作业动态添加触发器。当我尝试使用以下代码实现此目标时,我遇到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);

3 个答案:

答案 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)

  1. 通过 for job 方法构建触发器并与作业关联
  2. 使用此触发器安排作业
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity(trigger.getName(),trigger.getGroup())
.withSchedule(cronScheduleBuilder)
.forJob(trigger.getJobName(),trigger.getJobGroup())
.build();
     
scheduler.scheduleJob(cronTrigger);