Не удается сохранить задание, потому что оно уже существует с этим идентификатором
Я новичок с кварцем. Мне удалось установить его и запустить. Но у меня есть ошибка, когда я запускаю его во второй раз, потому что задание уже существует с этим идентификатором.
Вот мой код:
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 ответа:
Вы можете:
Это действительно зависит от того, что вы хотите делать со своей работой!
Проверьте, существует ли уже "ключ задания", и удалите существующее задание перед созданием нового:
scheduler.deleteJob(job1Key);
Или создайте новое задание с другим ключом (в вашем случае каждый раз, когда вы выполняете
scheduleJobs()
, переменнаяi
имеет одно и то же значение (0
)Или просто повторно использовать ту же работу (зачем создавать новую работу, если старая все еще хороша)
Или используйте хранилище заданий RAM, которое не сохраняет задания в базе данных (каждое когда вы будете использовать свое программное обеспечение, у вас будет пустой магазин заданий)
Это не прямой ответ на конкретный код, указанный в вопросе, но я не заметил его при поиске в другом месте и подумал, что это может быть полезно для будущих читателей:
Если вы находитесь в ситуации, когда у вас есть существующее
Job
но просто хочу добавить новыйTrigger
, Вы можете позвонить:
scheduler.ScheduleJob(trigger);
И он добавит
Trigger
кJob
, не пытаясь воссоздатьJob
. Единственный трюк заключается в том, что вы должны убедиться, чтоTrigger
' sJobKey
является правильный.Мой общий код для этого взаимодействия выглядит примерно так:
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);