Невозможно сохранить долговременную работу, потому что она уже существует

1

То, что я пытаюсь сделать, это удалить триггер из моей работы и присвоить ему новый. Я ограничил своих пользователей возможностью добавлять только один триггер для каждого задания. Но я хотел бы дать им возможность удалить этот триггер и добавить новый триггер в ту же работу.

Чтобы не потерять информацию о моей работе, я добавляю свои рабочие места как durable.

Затем я нахожу триггер, связанный с этим заданием, и использую

sched.UnscheduleJob(trigger.Key);

для удаления триггера (который также должен отменить расписание задания, если это не durable что является моим делом).

Теперь я знаю, что триггер был удален, но моя работа все еще существует. Когда я пытаюсь добавить новый триггер в эту работу, используя

sched.ScheduleJob(job, newTrigger);

Я получаю сообщение об ошибке:

Не удалось сохранить задание: невозможно сохранить задание: "MYGROUP.MYJOB", поскольку он уже существует с этим идентификатором.

И это то, что я знаю, но мне все же хотелось бы связать новый триггер с этой работой.

Почему это происходит? И как я могу добавить новый триггер к старой задаче, не удаляя старую работу?

Теги:
quartz.net
job-scheduling

1 ответ

3
Лучший ответ

Это довольно распространенная ошибка; как вы, вероятно, можете сказать, вызов 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню