Cela devrait être très facile. J'utilise Quartz qui tourne sous Apache Tomcat 6.0.18, et j'ai une fichier jobs.xml qui met en place mon travail planifié qui s'exécute toutes les minutes.
Ce que j'aimerais faire, c'est que si la tâche est toujours en cours au moment du prochain déclenchement, je ne veux pas lancer une nouvelle tâche, afin de laisser l'ancienne instance se terminer.
Existe-t-il un moyen de spécifier cela dans le fichier jobs.xml (empêcher les instances concurrentes) ?
Si ce n'est pas le cas, existe-t-il un moyen de partager l'accès à un singleton en mémoire au sein de l'interface utilisateur de mon application ? Emploi (est-ce par le biais de la JobExecutionContext ?) afin que je puisse gérer moi-même la concurrence ? (et détecter si une instance précédente est en cours d'exécution)
mettre à jour : Après avoir cherché dans la documentation, voici quelques approches que j'envisage, mais soit je ne sais pas comment les faire fonctionner, soit il y a des problèmes.
-
Utilisez StatefulJob . Cela empêche l'accès simultané... mais je ne suis pas sûr des autres effets secondaires qui se produiraient si je l'utilisais, je veux aussi éviter la situation suivante :
Supposons que les temps de déclenchement soient toutes les minutes, c'est-à-dire que le trigger#0 = au temps 0, le trigger #1 = 60000msec, #2 = 120000, #3 = 180000, etc. et le trigger#0 au temps 0 déclenche mon job qui prend 130000msec. Avec un job ordinaire, les déclencheurs #1 et #2 sont exécutés pendant que le déclencheur #0 est toujours en cours. Avec un StatefulJob, les triggers #1 et #2 seraient exécutés dans l'ordre, immédiatement après que le #0 se soit terminé à 130000. Ce n'est pas ce que je veux, je veux que les triggers #1 et #2 ne s'exécutent pas et que le prochain trigger qui lance un job ait lieu à #3 (180000msec). Je dois donc encore faire quelque chose d'autre avec StatefulJob pour qu'il fonctionne comme je le souhaite, et je ne vois pas vraiment d'avantage à l'utiliser.
-
Utilisez un TriggerListener pour renvoyer true de vetoJobExecution().
Bien que l'implémentation de l'interface semble simple, je dois trouver comment configurer une instance d'un TriggerListener de manière déclarative. Je ne trouve pas les documents relatifs au fichier xml. .
-
Utilisez un
static
objet partagé à sécurité thread (par exemple un sémaphore ou autre) appartenant à ma classe qui implémente Job.Je n'aime pas l'idée d'utiliser des singletons via l'option
static
sous Tomcat/Quartz, je ne suis pas sûr qu'il y ait des effets secondaires. De plus, je ne veux pas vraiment qu'ils soient de véritables singletons, juste quelque chose qui est associé à une définition de travail particulière. -
Mettre en œuvre mes propres Déclencheur qui prolonge SimpleTrigger et contient un état partagé qui pourrait exécuter son propre TriggerListener.
Encore une fois, je ne sais pas comment configurer le fichier XML pour utiliser ce déclencheur plutôt que le standard
<trigger><simple>...</simple></trigger>
.
8 votes
Dans les nouvelles versions de Quartz, le marquage de la classe implémentant le travail avec @DisallowConcurrentExecution permet de s'assurer qu'une seule classe s'exécute à la fois...