Quartz为已有作业添加触发器

问题描述 投票:0回答:1

我正在使用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);
java quartz-scheduler job-scheduling quartz crontrigger
1个回答
1
投票

快速问题:示例代码是否与您获得异常的代码完全相同? 或者示例代码可能不完整,您需要更新它。

无论如何,我认为您当前的示例代码中存在一个错误: - 使用触发器的标识创建“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是有道理的


0
投票

你能替换吗?

            scheduler.scheduleJob(jobDetail, trigger1);

用下面再试一次

            scheduler.scheduleJob(trigger1);
© www.soinside.com 2019 - 2024. All rights reserved.