2010-06-02 8 views
9

Ich möchte einen Verlauf von Jobs verwalten, die von einem Quartz-Scheduler mit den folgenden Eigenschaften geplant wurden: 'Startzeit', 'Endzeit', 'Erfolg', 'Fehler ".So verwalten Sie einen Jobverlauf mit dem Quartz-Scheduler

Dafür gibt es zwei Schnittstellen: ITriggerListener und IJobListener (Ich verwende die C# -Namenskonvention für Schnittstellen, weil ich Quartz.NET verwende, aber die gleiche Frage könnte für die Java-Version gestellt werden).

IJobListener hat eine und eine JobWasExecuted Methode. Letzteres bietet eine JobExecutionException, so dass Sie wissen, wenn etwas schief gelaufen ist. Es gibt jedoch keine Möglichkeit, und JobWasExecuted zu korrelieren. Angenommen, mein Job dauert zehn Minuten. Ich starte es bei t0 und t0+2 (so überlappen sie sich). Ich bekomme zwei Anrufe zu JobToBeExecuted und füge zwei Startzeiten in meine Geschichtstabelle ein. Wenn beide Jobs bei t1 und t1+2 enden, erhalte ich zwei Anrufe zu JobWasExecuted. Woher weiß ich, welcher Datenbankeintrag bei jedem Anruf aktualisiert werden soll (um eine Endzeit mit der entsprechenden Startzeit zu speichern)?

ITriggerListener hat ein anderes Problem. Es gibt keine Möglichkeit, Fehler innerhalb der TriggerComplete Methode zu erhalten, wenn ein Job fehlgeschlagen ist.

Wie bekomme ich das gewünschte Verhalten?

Antwort

12

Die Art und Weise, dies zu tun, ist eine Kennung in JobToBeExecuted, sollte sie in der JobExecutionContext und Abrufen aus dem JobExecutionContext in JobWasExecuted wieder zu erzeugen.

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

Der Scheduler muss einen Schlüssel verwalten, mit dem jeder Verlaufseintrag korreliert werden kann. Es muss eine eindeutige Job-ID irgendeiner Art geben, die erstellt wird, wenn ein Job gestartet wird, um dies zu erreichen.

Sie erwähnen so etwas nicht, also dachte ich, es wäre einen Vorschlag wert.

UPDATE: Ich würde einen Datensatz in die Datenbank einfügen, wenn ein Job erstellt wird und den Primärschlüssel (möglicherweise eine GUID) zurück. Ich würde das als Schlüssel benutzen.

+0

Haben Sie eine Ahnung, wo ich so finden konnte ein Schlüssel? –

+0

Derzeit ist der Schlüssel JobGroup, JobName und Datum und Uhrzeit. Es scheint, dass ein besserer Schlüssel in der Version 2.0 kommt. –

1

Wenn Sie zufrieden sind, nur die Datenbank am Ende zu aktualisieren, können Sie die Jobnamen zu bekommen und die Zeit vom IJobExecutionContext laufen:

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); 
} 
Verwandte Themen