Как поддержать историю задания с помощью Кварцевого планировщика

Я хотел бы поддержать историю заданий, которые были запланированы Кварцевым планировщиком, содержащим следующие свойства: 'время начала', 'время окончания', 'успех', 'ошибка'.

Существует два интерфейса, доступные для этого: 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 метод, когда задание перестало работать.

Как я получаю желаемое поведение?

9
задан Nathaniel Waisbrot 31 May 2013 в 03:30
поделиться

2 ответа

Для этого нужно сгенерировать идентификатор в 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, ...);
}
12
ответ дан 4 December 2019 в 12:16
поделиться

Планировщик должен поддерживать ключ, который позволяет ему соотносить каждую запись в истории. Для этого должен быть уникальный идентификатор задания, который создается при запуске задания.

Вы не упомянули об этом, поэтому я подумал, что это стоит вашего предложения.

ОБНОВЛЕНИЕ: Я ВСТАВЛЯЮ запись в базу данных при создании задания и возвращаю первичный ключ (возможно, GUID). Я бы использовал это как ключ.

4
ответ дан 4 December 2019 в 12:16
поделиться