web-dev-qa-db-fra.com

Programmation du printemps: @Scheduled vs Quartz

Je lis les Spring 3.0 doc s concernant la planification. Je penche vers JobDetailBean de Spring pour Quartz. Cependant, l'annotation @ Scheduled a capté mon attention. Il semble que ce soit une autre façon de planifier la tâche à l'aide de Spring Framework. Sur la base des documents, Spring propose trois méthodes de planification:

  1. @Programmé
  2. Via Quartz
  3. Via JDK Timer

Je n'ai aucun intérêt pour la minuterie JDK. Pourquoi devrais-je choisir @Scheduled plutôt que Quartz? (Quand je parle de Quartz, je veux dire utiliser le wrapper de haricots de Spring pour Quartz).

Disons que mon cas d'utilisation est suffisamment complexe pour que je communique avec un service Web tiers pour importer et exporter des données à des intervalles spécifiés.

43
chris

Le quartz est un ordre de grandeur plus complexe que le planificateur intégré de Spring, y compris la prise en charge des travaux persistants, transactionnels et distribués. C'est un peu un cochon, cependant, même avec le support de l'API de Spring.

Si tout ce dont vous avez besoin est d'exécuter des méthodes sur un bean toutes les X secondes, ou sur une planification cron, alors @Scheduled (ou les différentes options de Spring's <task> schéma de configuration ) est probablement suffisant

34
skaffman

Je dois faire part de ma propre expérience concernant l'utilisation de @Scheduled versus Quartz comme implémentation de planification dans une application Spring.

La planification des travaux avait les exigences suivantes:

  • Les utilisateurs finaux devraient avoir la possibilité d'enregistrer et de planifier (définir le temps d'exécution) leurs propres tâches
  • Les travaux planifiés pendant les temps d'arrêt du serveur ne doivent pas être omis de la file d'attente des travaux

Par conséquent, nous devons essayer d'utiliser l'implémentation Quartz (version 2.2.3) afin de prendre en charge la persistance des travaux dans une base de données. Quelques conclusions de base sont les suivantes:

  • L'intégration avec une application Spring 4 MVC n'est pas difficile du tout en utilisant le fichier quartz.properties.
  • Nous avions la possibilité de choisir une deuxième base de données pour stocker les travaux à partir de la base de données principale.
  • Les travaux planifiés pendant l'arrêt du serveur commencent à s'exécuter tant que le serveur démarre.
  • En prime, nous avons réussi à conserver dans la base de données principale des informations utiles (et plus orientées utilisateur) sur les travaux planifiés définis par l'utilisateur à l'aide de JobListener et TriggerListener personnalisés.
  • Quartz est une bibliothèque très utile dans les applications avec des exigences de planification plus complexes.
10
lzagkaretos

Selon Documentation Quartz

Nous pouvons utiliser une fonctionnalité plus complexe qui n'existe pas dans @Scheduler. par exemple:

  1. dans Quartz, nous pouvons placer un planificateur en mode veille avec scheduler.standby(); et le planifier à nouveau avec scheduler.start();.
  2. arrêter un planificateur avant l'exécution du travail ou après cela avec scheduler.shutdown(true); et scheduler.shutdown(false);
  3. stocker un travail pour une utilisation ultérieure et lorsque vous en avez besoin, vous pouvez le déclencher.

JobDetail job1 =newJob(MyJobClass.class). withIdentity("job1","group1"). storeDurably(). build();

  1. Ajoutez le nouveau travail au planificateur, en lui demandant de "remplacer" le travail existant par le nom et le groupe donnés (le cas échéant).

JobDetail job1 = newJob(MyJobClass.class). withIdentity("job1", "group1"). build();

1
Saman Salehi

Au printemps, vous pouvez planifier des tâches en utilisant FixedRate, FixedDelay et cron. Mais la plupart des travaux planifiés nécessitent une gestion dynamique du temps d'exécution. Donc, dans ce scénario, il est préférable d'utiliser Quartz car il offre la possibilité de stocker des travaux planifiés dans DBJobstore ainsi que RAMJobstore.

0
Cyril Sojan