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". P>
Il y a deux interfaces disponibles pour ceci: Comment puis-je obtenir le comportement souhaité? P> iTriggerListener code> et
ijoblistener code> (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). P>
ijoblistener code> a un
jobtobeeexecued code> et a
mode jobwasexecuted code> méthode. Ce dernier fournit un
jobexecutionException code> afin que vous sachiez quand quelque chose s'est mal passé. Cependant, il n'ya aucun moyen de corréler
jobtobeeexecuted code> et
jobwasexecuted code>. Supposons que mon travail fonctionne pendant dix minutes. Je commence à
t0 code> et
t0 + 2 code> (donc ils se chevauchent). Je reçois deux appels vers
jobtobeeexecuted code> et insérer deux heures de début dans ma table d'historique. Lorsque les deux travaux terminés à
T1 CODE> et
T1 + 2 CODE> I Obtenez deux appels vers
JobWaseXecuted code>. 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)? P>
iTriggerListener code> a un autre problème. Il n'y a aucun moyen d'obtenir des erreurs dans la méthode code> triggercomplete code> lorsqu'un emploi a échoué. P>
3 Réponses :
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. p>
Vous ne mentionnez pas une telle chose, alors je pensais que cela valait une suggestion. P>
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é. P>
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.
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, ...);
}
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 code>: