首页 > 解决方案 > Quartz为已经存在的工作添加触发器

问题描述

我正在使用石英框架来添加和安排作业和触发器。要求是为数据库中已经存在的作业动态添加触发器。当我试图用下面的代码实现这一点时,我得到了 org.quartz.ObjectAlreadyExistsException: Unable to store 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);

标签: javaquartz-schedulerjob-schedulingquartzcrontrigger

解决方案


快速提问:示例代码与您获得异常的代码完全相同吗?
或者,示例代码可能不完整,您需要对其进行更新。

无论如何,我认为您当前的示例代码中有一个错误
: -您使用触发器的身份创建“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);

2 参数方法的 JavaDocscheduler.scheduleJob(JobDetail, Trigger)清楚地表明,
它将尝试根据提供的 JobDetail 创建作业
- 所以为什么你得到 ObjectAlreadyExistsException 是有道理的


推荐阅读