10 votes

Interruption d'un travail dans un cluster de quartz

J'ai une installation Quartz avec plusieurs instances et je veux interrompre un travail où qu'il soit exécuté. Comme il est dit dans la documentation, Scheduler.interrupt() n'est pas compatible avec les clusters. Je cherche donc une pratique commune pour surmonter cette limitation.

2voto

ZNK - M Points 2437

Voici quelques principes de base à respecter pour y parvenir.

En mode cluster, les informations sur les travaux en cours sont disponibles dans les tables de quartz. Par exemple, les tables q_fired_triggers contient le travail en cours d'exécution. La première colonne de ce tableau est le nom de l'ordonnanceur qui en est responsable. Il est donc assez facile de savoir qui fait quoi.

Ensuite, si vous activez l'exportation JMX de vos instances de quartz org.quartz.scheduler.jmx.export En utilisant les MBeans, vous activerez un nouveau point d'entrée pour gérer à distance chaque planificateur individuellement. Le MBean fournit une méthode boolean interruptJob("JobName", "JobGroup")

Ensuite, vous " juste "doit appeler cette méthode sur l'instance de planificateur concernée pour l'interrompre effectivement.

J'ai essayé tous les processus manuellement et cela fonctionne bien, il faut juste l'automatiser :)

HIH

1voto

Duy Dang Points 1

Ont raison. Le site Scheduler.interrupt() ne fonctionne pas en mode cluster. Supposons qu'un déclencheur de travail soit activé par un planificateur dans un nœud, mais que cette API soit appelée dans un autre nœud.

Pour surmonter ce problème, vous pouvez utiliser l'approche du courtier en messages (par exemple JMS, RabbitMQ, etc.) avec le modèle de publication/abonnement. Au lieu d'appeler Scheduler.interrupt() le client envoie un message de cette interruption au courtier en messages, la charge utile du message étant constituée de l'identité du détail de la tâche, à savoir JobKey et le nom de l'ordonnanceur ((s'il y a plusieurs ordonnanceurs utilisés dans un nœud). Ensuite, le message est consommé par tous les nœuds dans lesquels l'instance de Quartz est en cours d'exécution, et les nœuds trouvent l'ordonnanceur de Quartz par son nom et exécutent alors Scheduler.interrupt() du planificateur trouvé avec l'identité du détail du travail extrait de la charge utile du message.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X