无法存储作业,因为已存在具有此标识的作业

2022-09-03 09:15:10

我是 Quartz 的新手。我成功地安装并运行它。但是当我第二次运行它时,我遇到了一个错误,因为作业已经存在,并且具有此标识。

这是我的代码:

public void scheduleJobs() throws Exception {

    try {
        int i = 0;

        scheduler = new StdSchedulerFactory().getScheduler();

        JobKey job1Key = JobKey.jobKey("job"+i, "my-jobs"+i);
        JobDetail job1 = JobBuilder
                .newJob(SimpleJob.class)
                .withIdentity(job1Key)
                .build();

        TriggerKey tk1 = TriggerKey.triggerKey("trigger"+i, "my-jobs"+i);
        Trigger trigger1 = TriggerBuilder
                .newTrigger()
                .withIdentity(tk1)
                .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(11, 25))
                .build();

        scheduler.start(); // start before scheduling jobs
        scheduler.scheduleJob(job1, trigger1);
        i++;

        printJobsAndTriggers(scheduler);

    } catch (SchedulerException e) {
        LOG.error("Error while creating scheduler", e);
    }   
}

我试图使用整数i来更改名称,但它不起作用。你知道我该如何解决它吗?非常感谢。


答案 1

您可以:

  • 检查“作业键”是否已经存在,并在创建新作业之前删除现有作业:

    scheduler.deleteJob(job1Key);

  • 或者使用另一个键创建一个新作业(在您的情况下,每次执行时,变量具有相同的值(scheduleJobs()i0)

  • 或者只是重用相同的工作(如果旧工作仍然很好,为什么要创建一个新工作)

  • 或者使用 RAM 作业存储,它不会将作业保留在数据库中(每次使用软件时,您都会有一个空的作业存储)

这真的取决于你想用你的工作做什么!


答案 2

在计划之前检查现有作业:

JobDetail job;
SimpleTrigger trigger;

//Create your trigger and job

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();

if (scheduler.checkExists(job.getKey())){
    scheduler.deleteJob(job.getKey());
}
scheduler.scheduleJob(job, trigger);

推荐