10
votes

Comment maintenir un emploi d'emploi à l'aide du planificateur de quartz

J'aimerais conserver une histoire d'emplois prévus par un planificateur de quartz contenant les propriétés suivantes: "Heure de début", "Temps de fin", "Succès", "Erreur".

Il y a deux interfaces disponibles pour ceci: iTriggerListener et ijoblistener (J'utilise la convention de nommage C # pour interfaces car j'utilise quartz.net mais identique la question pourrait être posée pour la version Java).

ijoblistener a un jobtobeeexecued et a mode jobwasexecuted méthode. Ce dernier fournit un jobexecutionException afin que vous sachiez quand quelque chose s'est mal passé. Cependant, il n'ya aucun moyen de corréler jobtobeeexecuted et jobwasexecuted . Supposons que mon travail fonctionne pendant dix minutes. Je commence à t0 et t0 + 2 (donc ils se chevauchent). Je reçois deux appels vers jobtobeeexecuted et insérer deux heures de début dans ma table d'historique. Lorsque les deux travaux terminés à T1 et T1 + 2 I Obtenez deux appels vers JobWaseXecuted . Comment savoir quel enregistrement de base de données à mettre à jour dans chaque appel (pour stocker une heure de fin avec son temps de début correspondant)?

iTriggerListener a un autre problème. Il n'y a aucun moyen d'obtenir des erreurs dans la méthode triggercomplete lorsqu'un emploi a échoué.

Comment puis-je obtenir le comportement souhaité?


0 commentaires

3 Réponses :


4
votes

Le planificateur doit conserver une clé qui le permet de corréler chaque entrée d'histoire. Il doit y avoir un identifiant de travail unique de quelque sorte créé lorsqu'un emploi commence à pouvoir accomplir cela.

Vous ne mentionnez pas une telle chose, alors je pensais que cela valait une suggestion.

Mise à jour: J'insérerais un enregistrement dans la base de données lorsqu'un travail est créé et récupérez la clé primaire (peut-être un GUID). J'utiliserais cela comme clé.


2 commentaires

Avez-vous une idée où je pourrais trouver une telle clé?


Actuellement, la clé est JobGroup, Jobname et la date et l'heure. Il semble qu'une meilleure clé arrive dans la version 2.0.



12
votes

Le moyen de le faire consiste à générer un identifiant dans jobtobeeexecuted code>, stockez-le dans le jobexecutionContext code> et récupérez-le à partir du jobexecutionContext code> jobwasexecuted code>.

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, ...);
}


0 commentaires

1
votes

Si vous êtes heureux de simplement mettre à jour la base de données à la fin, vous pouvez obtenir le nom du travail et l'exécution du temps à partir du ijobexecutionContext : xxx


0 commentaires