То, что я пытаюсь сделать, это удалить триггер из моей работы и присвоить ему новый. Я ограничил своих пользователей возможностью добавлять только один триггер для каждого задания. Но я хотел бы дать им возможность удалить этот триггер и добавить новый триггер в ту же работу.
Чтобы не потерять информацию о моей работе, я добавляю свои рабочие места как durable
.
Затем я нахожу триггер, связанный с этим заданием, и использую
sched.UnscheduleJob(trigger.Key);
для удаления триггера (который также должен отменить расписание задания, если это не durable
что является моим делом).
Теперь я знаю, что триггер был удален, но моя работа все еще существует. Когда я пытаюсь добавить новый триггер в эту работу, используя
sched.ScheduleJob(job, newTrigger);
Я получаю сообщение об ошибке:
Не удалось сохранить задание: невозможно сохранить задание: "MYGROUP.MYJOB", поскольку он уже существует с этим идентификатором.
И это то, что я знаю, но мне все же хотелось бы связать новый триггер с этой работой.
Почему это происходит? И как я могу добавить новый триггер к старой задаче, не удаляя старую работу?
Это довольно распространенная ошибка; как вы, вероятно, можете сказать, вызов sched.ScheduleJob(job, newTrigger)
пытается повторно вставить JobDetail
в таблицу QRTZ_JOB_DETAILS. Это приведет к нарушению ограничения, поскольку первичный ключ к таблице является составной частью имени планировщика, JobKey
и JobGroup
. Кварц аккуратно обрабатывает это внутренне и дает вам значимую ошибку вместо того, чтобы просто сообщать о нарушении первичного ключа.
Решение на самом деле так же просто, как замена старого триггера новым.
ITrigger newTrigger = TriggerBuilder.Create()
.WithCronSchedule(newExpression)
.WithIdentity(newTriggerKey)
.StartNow()
.Build();
sched.RescheduleJob(existingTrigger.Key, newTrigger);