Не удается сохранить задание, потому что оно уже существует с этим идентификатором


Я новичок с кварцем. Мне удалось установить его и запустить. Но у меня есть ошибка, когда я запускаю его во второй раз, потому что задание уже существует с этим идентификатором.

Вот мой код:

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, чтобы изменить имя, но это не работает. У вас есть какие-нибудь идеи, как я могу это исправить? Большое спасибо.

4 6

4 ответа:

Вы можете:

  • Проверьте, существует ли уже "ключ задания", и удалите существующее задание перед созданием нового:

    scheduler.deleteJob(job1Key);

  • Или создайте новое задание с другим ключом (в вашем случае каждый раз, когда вы выполняете scheduleJobs(), переменная i имеет одно и то же значение (0)

  • Или просто повторно использовать ту же работу (зачем создавать новую работу, если старая все еще хороша)

  • Или используйте хранилище заданий RAM, которое не сохраняет задания в базе данных (каждое когда вы будете использовать свое программное обеспечение, у вас будет пустой магазин заданий)

Это действительно зависит от того, что вы хотите делать со своей работой!

Это не прямой ответ на конкретный код, указанный в вопросе, но я не заметил его при поиске в другом месте и подумал, что это может быть полезно для будущих читателей:

Если вы находитесь в ситуации, когда у вас есть существующее Job но просто хочу добавить новый Trigger, Вы можете позвонить:

scheduler.ScheduleJob(trigger);

И он добавит Trigger к Job, не пытаясь воссоздать Job. Единственный трюк заключается в том, что вы должны убедиться, что Trigger ' s JobKey является правильный.

Мой общий код для этого взаимодействия выглядит примерно так:

IJobDetail job;   // Handed in
ITrigger trigger; // Handed in

// Keeping track of this because we need to know later whether it's new or not
var newJob = job == null;
if (newJob)
{
    job = JobBuilder.Create<TargetJob>()
                 .WithIdentity([whatever]) 
                 [.OtherConfiguration()]
                 .Build();
}

var trigger = TriggerBuilder
    .Create()
    .WithIdentity([whatever])
    // ** Gotcha #1: Make sure it's linked to the job **
    .ForJob(job.Key) 
    [.OtherConfiguration()]
    .Build();

if (newJob)
{
    _scheduler.ScheduleJob(job, trigger);
}
else
{
    // ** Gotcha #2: Make sure you don't reschedule the job **
    _scheduler.ScheduleJob(trigger);
}

Проверьте наличие существующего задания перед планированием:

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);

Вы можете создавать новые рабочие места, принимая i в качестве статического int. И вместо " job "+i это будет " job " + Integer.toString (i). Это сработало для меня.