11
votes

Exécuter un emploi une seule fois avec quartz

Y a-t-il une façon de pouvoir exécuter un emploi une seule fois avec quartz en Java? Je comprends qu'il n'a pas de sens d'utiliser Quartz dans ce cas. Mais, c'est, j'ai plusieurs emplois et ils sont courus plusieurs fois. Donc, j'utilise quartz.

Est-ce que cela est encore possible?


0 commentaires

7 Réponses :


16
votes

Vous devez utiliser SimpleTrigger qui se déclenche à temps spécifique et sans répéter. Triggerutils a de nombreuses méthodes pratiques pour créer ce genre de choses.


4 commentaires

Toutes les méthodes pratiques sont parties dans la version 2.0. Une idée où ils sont maintenant?


@Jensschauder ressemble à ceux-ci qui sont tous déplacés dans les différents enfants de la barnierBuilder, par exemple CrossecheduleBuilder. La façon dont les choses fixent est un peu déroutant. Comme vous devez utiliser le TiggerBuilder pour créer un déclencheur et transmettez-le un calendrier avec une méthode WithSchedule, où l'horaire est lui-même un déclencheur.


N'aimera pas d'emploi à l'aide d'un SimpleTrigger exécuter une seule fois, chaque fois que l'application est démarrée? Il ne sera pas continuellement sonder, ce qui est bon, cependant, il sera exécuté à chaque exécution de l'application entraînant des travaux supplémentaires afin de garantir que les actions non idompotes ne fonctionnent à nouveau.


Vous pouvez déclencher un travail juste une fois, comme Scheduler.triggerjob. Si vous configurez un tel travail à exécuter sur Demande Start, bien sûr, il fonctionnera. Tout dépend de la configuration.



6
votes

in quartz> 2.0, vous pouvez obtenir le planificateur de transmettre n'importe quel travail après le travail: xxx

où TriggerKey est l'identifiant du travail à exécuter une seule fois. Après cela, le travail ne serait plus appelé.


0 commentaires

2
votes

Je ne sais pas combien de fois la similarité est Quartz à Mono et Java, mais cela semble travailler dans .NET

TriggerBuilder.Create ()
        .StartNow ()
        .Build (); 


0 commentaires

4
votes

Voici un exemple de comment exécuter une classe clastjob immédiatement avec quartz 2.x : xxx

Voir aussi Didacticiels de planificateur de travail de quartz Enterprise SimpleRiggers


0 commentaires

8
votes

Oui, c'est possible!

JobKey jobKey = new JobKey("testJob");
JobDetail job = newJob(TestJob.class)
            .withIdentity(jobKey)
            .storeDurably()
            .build();
scheduler.addJob(job, true);
scheduler.triggerJob(jobKey); //trigger a job inmediately


0 commentaires

0
votes

Une autre solution: il y a une méthode .withrepeatcount (0) dans simpleDulerBuilder: xxx


0 commentaires

1
votes

Je devais me demander s'il était logique d'essayer de configurer un emploi et d'ajouter des chèques s'il avait été exécuté déjà comme suggéré dans la réponse de Marko Lahma (puisque la planification d'un emploi à exécuter une fois les résultats en cours d'exécution une fois, à chaque fois Nous commençons l'application). J'ai trouvé des exemples d'applications de CommandLinerunner qui ne fonctionnaient pas vraiment pour moi, principalement parce que nous avions déjà un ApplicationRunner utilisé pour d'autres emplois qui utilisent la planification de quartz / cron. Je n'étais pas content d'avoir un quartz initialiser cet emploi à l'aide d'un SimpleTrigger, alors je devais trouver autre chose.

Utiliser quelques idées des articles suivants: p>

  • Multiple Spring Boot Commandlinerunner basé sur l'argument de ligne de commande a> li>
  • Exécuter le travail de lots de printemps programmatique? li>
  • Tirer manuellement des emplois de quartz manuellement li>
  • y a-t-il moyen d'obtenir des clés d'emploi dans quartz par nom de travail li>
  • Comment répertorier tout Emplois dans le planificateur de quartz li>
  • Spring Boot Commandlinerunner et ApplicationRunner LI> ul>

    J'ai pu créer une implémentation de travail qui me permet de faire ce qui suit: p>

    • Exécutez les travaux existants via Quartz, sur une minuterie li>
    • Exécutez un nouveau travail, une fois par programmation (un travail de quartz à usage unique utilisant SimpleTrigger n'a pas satisfait à mes besoins, car il serait exécuté une fois sur chaque charge d'application) LI> ul>

      J'ai proposé la classe CommandLinerunner suivante: p> xxx pré>

      dans l'une de mes classes de configuration, j'ai ajouté un bean CommandLinerunner qui appelle la commande Custom CommandLinerunner que j'ai créée: p> xxx pré>

      plus tard, je suis capable d'initier ces travaux via la CLI sans affecter mes travaux planifiés de quartz actuels et que personne ne gère la commande via CLI plusieurs fois, il ne sera plus jamais couru à nouveau. Je dois faire du jonglage de types puisque j'accepte les applicationsArguments, puis les convertissez-les en chaîne []. P>

      Enfin, je suis capable de l'appeler comme ceci: P>

      java -jar <your_application>.jar --jobName=<QuartzRegisteredJobDetailFactoryBean>
      
      • Le travail doit être enregistré en tant que JobDetailFactoryBean (E.G.: Scheduler.setjobdétails (...) CODE>) LI>
      • Tout est essentiellement identique à celui d'un travail avec CrontriggerFactoryBean, à l'exception du défenseur Scheduler.SetTriggers (...) CODE> Appel LI>
      • Spring sait à exécuter les classes CommandLinerUnner après que l'application ait démarré LI>
      • i code à code qualifié le paramètre étant transmis dans l'application sur "Jobname" LI>
      • J'ai assumé un nom de groupe de "défaut" pour tous les travaux; Si vous souhaitez utiliser des groupes différents, il faudrait être ajusté lors de la récupération de EkyKey, qui est utilisée pour exécuter le travail LI>
      • Il n'y a rien qui empêche ce travail d'être exécuté plusieurs fois via CLI, mais il a été déclenché sur chaque charge d'application utilisant une approche SimpleTrigger, c'est donc mieux pour moi; Si cela n'est pas acceptable, peut-être utiliser Steplistener et SortiStatus, etc. peut l'empêcher d'être exécuté deux fois li> ul> p>


0 commentaires