2010-10-29 6 views
3

Si un planificateur Quartz fonctionne avec un ensemble de déclencheurs et que je souhaite effacer tous les déclencheurs, quel est le meilleur moyen de le faire? J'ai considéré l'itération sur les groupes et les noms, en appelant non programmée comme je vais, mais cela semble très lent quand il y a des milliers de déclencheurs en place (environ 2s pour déconnecter 10 déclencheurs). Un test élémentaire rudimentaire (programmation de 1000 déclencheurs, suppression de lots de 100) montre une complexité exponentielle w.r.t. le nombre de déclencheurs programmés sur l'opération déprogrammer:Comment effacer les déclencheurs dans un planificateur à quartz

Deleted 100 triggers in 3594ms,35.94 triggers/ms 
Deleted 100 triggers in 2734ms,13.67 triggers/ms 
Deleted 100 triggers in 2453ms,8.176666666666666 triggers/ms 
Deleted 100 triggers in 1985ms,4.9625 triggers/ms 
Deleted 100 triggers in 1547ms,3.094 triggers/ms 
Deleted 100 triggers in 1281ms,2.135 triggers/ms 
Deleted 100 triggers in 1047ms,1.4957142857142858 triggers/ms 
Deleted 100 triggers in 765ms,0.95625 triggers/ms 
Deleted 100 triggers in 485ms,0.5388888888888889 triggers/ms 
Deleted 100 triggers in 156ms,0.156 triggers/ms 

Je ne peux pas trouver toutes sortes de méthodes en vrac pour effacer les choses. J'ai finalement envisagé d'arrêter le planificateur et de le lâcher pour la récupération de place, mais je ne suis pas sûr s'il y a quelque chose d'autre dont je pourrais avoir besoin pour m'assurer qu'il n'est référencé nulle part.

Quelqu'un at-il une idée de la meilleure approche ici?

Répondre

2

Combien de déclencheurs et d'emplois aurez-vous? Lorsque les déclencheurs sont stockés en mémoire dans des structures de type carte, pour un grand nombre d'entre eux, la mémoire est importante et plus il y a de déclencheurs, plus les opérations sont lentes.

Avez-vous considéré magasin de base de données? Vous pouvez profiter de la capacité SQL pour opérer sur un ensemble de données et supprimer le groupe entier de déclencheurs, ou tous les triggers correspondant à pattern avec une seule commande.

1

Je pense que votre meilleur pari est d'utiliser simplement la méthode shutdown du planificateur. Vous pouvez appeler scheduler.shutdown(true) si vous souhaitez que tous les travaux en cours d'exécution se terminent avant l'arrêt du planificateur. Selon le Quartz API, l'appel de l'arrêt nettoie toutes les ressources associées au planificateur.