Je suggère pour plus de flexibilité et de configurabilité pour mieux stocker dans votre DB deux décalages: la repeatOffset qui vous dira après combien de temps le travail doit être rejugé et la trialPeriodOffset qui gardera la information de la fenêtre temporelle que le travail est autorisé à être replanifié. Ensuite, vous pouvez récupérer ces deux paramètres comme (je suppose que vous utilisez Spring):
String repeatOffset = yourDBUtilsDao.getConfigParameter(..);
String trialPeriodOffset = yourDBUtilsDao.getConfigParameter(..);
Alors, au lieu du travail de se rappeler le compteur, il devra se rappeler le initalAttempt:
Long initialAttempt = null;
initialAttempt = (Long) existingJobDetail.getJobDataMap().get("firstAttempt");
et effectuer quelque chose comme le contrôle suivant:
long allowedThreshold = initialAttempt + Long.parseLong(trialPeriodOffset);
if (System.currentTimeMillis() > allowedThreshold) {
//We've tried enough, time to give up
log.warn("The job is not going to be rescheduled since it has reached its trial period threshold");
sched.deleteJob(jobName, jobGroup);
return YourResultEnumHere.HAS_REACHED_THE_RESCHEDULING_LIMIT;
}
ce serait une bonne idée de créer un ENUM pour le résultat de la tentative qui est retourné au flux de travail de base de votre application comme ci-dessus.
construit alors le temps rééchelonnements:
Date startTime = null;
startTime = new Date(System.currentTimeMillis() + Long.parseLong(repeatOffset));
String triggerName = "Trigger_" + jobName;
String triggerGroup = "Trigger_" + jobGroup;
Trigger retrievedTrigger = sched.getTrigger(triggerName, triggerGroup);
if (!(retrievedTrigger instanceof SimpleTrigger)) {
log.error("While rescheduling the Quartz Job retrieved was not of SimpleTrigger type as expected");
return YourResultEnumHere.ERROR;
}
((SimpleTrigger) retrievedTrigger).setStartTime(startTime);
sched.rescheduleJob(triggerName, triggerGroup, retrievedTrigger);
return YourResultEnumHere.RESCHEDULED;
Merci. C'est ce que je cherchais. – Averroes
-1, je ne recommande pas cette approche - elle bloque l'un des fils de travail Quartz pendant 10 minutes.La bonne façon de procéder serait de faciliter la fonctionnalité Quartz existante - dire d'une manière ou d'une autre de relancer le même travail après 10 minutes - après tout, c'est ce pour quoi il est fait. Si nous devons exécuter du code et dormir, il ne sert à rien d'utiliser Quartz en premier lieu. –
compléter cela en Quartz 2.0 (pour .net au moins). Le StatefulJob est remplacé par 'PersistJobDataAfterExecutionAttribute' http://quartznet.sourceforge.net/apidoc/2.0/html/html/babe3560-218c-38de-031a-7fe1fdd569d2.htm – ossek