Я хотел бы поддержать историю заданий, которые были запланированы Кварцевым планировщиком, содержащим следующие свойства: 'время начала', 'время окончания', 'успех', 'ошибка'.
Существует два интерфейса, доступные для этого: ITriggerListener
и IJobListener
(Я использую соглашение о присвоении имен C# для интерфейсов, потому что я использую Quartz.NET, но тот же вопрос можно было задать для версии Java).
IJobListener
имеет a JobToBeExecuted
и a JobWasExecuted
метод. Последний обеспечивает a JobExecutionException
так, чтобы Вы знали, когда что-то пошло не так, как надо. Однако нет никакого способа коррелировать JobToBeExecuted
и JobWasExecuted
. Предположим мои прогоны задания в течение десяти минут. Я запускаю его в t0
и t0+2
(таким образом, они накладываются). Я получаю два вызова к JobToBeExecuted
и вставьте два, запускают времена в мою таблицу истории. Когда оба задания заканчиваются в t1
и t1+2
Я получаю два вызова к JobWasExecuted
. Как я знаю, какую базу данных записывают для обновления в каждом вызове (для хранения времени окончания его соответствующим временем начала)?
ITriggerListener
имеет другую проблему. Нет никакого способа получить любые ошибки в TriggerComplete
метод, когда задание перестало работать.
Как я получаю желаемое поведение?
Для этого нужно сгенерировать идентификатор в JobToBeExecuted
, сохранить его в JobExecutionContext
и снова получить его из JobExecutionContext
в JobWasExecuted
.
public void JobToBeExecuted(JobExecutionContext context)
{
// Insert history record and retrieve primary key of inserted record.
long historyId = InsertHistoryRecord(...);
context.Put("HistoryIdKey", historyId);
}
public void JobWasExecuted(JobExecutionContext context,
JobExecutionException jobException)
{
// Retrieve history id from context and update history record.
long historyId = (long) context.Get("HistoryIdKey");
UpdateHistoryRecord(historyId, ...);
}
Планировщик должен поддерживать ключ, который позволяет ему соотносить каждую запись в истории. Для этого должен быть уникальный идентификатор задания, который создается при запуске задания.
Вы не упомянули об этом, поэтому я подумал, что это стоит вашего предложения.
ОБНОВЛЕНИЕ: Я ВСТАВЛЯЮ запись в базу данных при создании задания и возвращаю первичный ключ (возможно, GUID). Я бы использовал это как ключ.