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.
Réponses
Trop de publicités?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
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.