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. P>
Est-ce que cela est encore possible? P>
7 Réponses :
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. P>
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.
in quartz> 2.0, vous pouvez obtenir le planificateur de transmettre n'importe quel travail après le travail: où TriggerKey est l'identifiant du travail à exécuter une seule fois. Après cela, le travail ne serait plus appelé. P> p>
Je ne sais pas combien de fois la similarité est Quartz à Mono et Java, mais cela semble travailler dans .NET
TriggerBuilder.Create () .StartNow () .Build ();
Voici un exemple de comment exécuter une classe code> clastjob code> immédiatement avec quartz 2.x em>: Voir aussi Didacticiels de planificateur de travail de quartz Enterprise → SimpleRiggers P> P>
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
Une autre solution: il y a une méthode .withrepeatcount (0) code> dans simpleDulerBuilder:
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>
J'ai pu créer une implémentation de travail qui me permet de faire ce qui suit: p>
J'ai proposé la classe CommandLinerunner suivante: p> 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> 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>
Scheduler.setjobdétails (...) CODE>) LI>
Scheduler.SetTriggers (...) CODE> Appel LI>