2010-06-02 2 views
9

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

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

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

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

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

ответ

12

Способ сделать это, чтобы генерировать идентификатор в 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, ...); 
} 
4

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

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

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

+0

У вас есть какие-либо идеи, где я мог бы найти такие ключ? –

+0

В настоящее время ключевым является JobGroup, JobName и дата и время. Похоже, что в выпуске 2.0 появился лучший ключ. –

1

Если вы счастливы просто обновить базу данных в конце концов, вы можете получить имя задания и время выполнения от 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); 
} 
Смежные вопросы