Как сохранить историю заданий с помощью планировщика Quartz

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

Для этого доступны два интерфейса: ITriggerListener и IJobListener (я использую соглашение об именовании C# для интерфейсов, потому что я использую Quartz.NET, но тот же вопрос можно задать для версии Java).

IJobListener имеет методы JobToBeExecuted и JobWasExecuted. Последний предоставляет JobExecutionException, чтобы вы знали, когда что-то пошло не так. Однако нет возможности сопоставить JobToBeExecuted и JobWasExecuted. Предположим, моя работа длится десять минут. Я начинаю с t0 и t0+2 (чтобы они пересекались). Я получаю два вызова JobToBeExecuted и вставляю два времени начала в свою таблицу истории. Когда оба задания заканчиваются в t1 и t1+2, я получаю два вызова JobWasExecuted. Как узнать, какую запись базы данных обновлять при каждом вызове (чтобы сохранить время окончания с соответствующим временем начала)?

У ITriggerListener другая проблема. Невозможно получить какие-либо ошибки внутри метода TriggerComplete при сбое задания.

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


person Ronald Wildenberg    schedule 02.06.2010    source источник


Ответы (3)


Способ сделать это — сгенерировать идентификатор в 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, ...);
}
person Ronald Wildenberg    schedule 03.06.2010

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

Вы не упоминаете такую ​​вещь, поэтому я подумал, что стоит предложить.

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

person duffymo    schedule 02.06.2010
comment
Вы не знаете, где я могу найти такой ключ? - person Ronald Wildenberg; 02.06.2010
comment
В настоящее время ключом является JobGroup, JobName, а также дата и время. Похоже, что в версии 2.0 появится лучший ключ. - person Brad Bruce; 15.07.2011

Если вы хотите просто обновить базу данных в конце, вы можете получить имя задания и время выполнения из IJobExecutionContext:

public void JobWasExecuted(JobExecutionContext context,
                       JobExecutionException jobException)
{
    var sql = @"INSERT INTO MyJobAuditHistory 
                (JobKey, RunTime, Status, Exception) VALUES (?, ?, ?, ?)";

    // create command etc.
    command.Parameters.Add(context.JobDetail.Key.ToString());
    command.Parameters.Add(context.JobRunTime);
    command.Parameters.Add(jobException == null ? "Success" : "Fail");
    command.Parameters.Add(jobException == null ? null : jobException.Message);
}
person Trevor Pilley    schedule 24.07.2013