Comment éviter le chevauchement des horaires de Printemps?
@Scheduled(fixedDelay = 5000)
public void myJob() {
Thread.sleep(12000);
}
Comment puis-je éviter ce printemps de l'emploi à partir de l'exécution si la routine n'est pas encore fini?
Vous devez vous connecter pour publier un commentaire.
Avec
fixedDelay
, la période est mesurée après l'achèvement de travail, donc pas de soucis.cron
(qui est définitivement prévu)?par défaut, spring utilise un thread unique Exécuteur testamentaire. donc pas de deux @tâches Planifiées ne sera jamais se chevaucher. même deux @Prévue méthodes complètement sans rapport avec les classes ne se chevauchent pas tout simplement parce que il n'existe qu'un seul thread pour l'exécution de tous @tâches Planifiées.
en outre, même si vous remplacez l'Exécuteur par défaut avec un pool de threads en fonction d'exécuteur testamentaire, ces Exécuteurs généralement retarder l'exécution d'une instance de la tâche jusqu'à ce que le précédemment instance planifiée complète. cela est vrai pour fixedDelay, fixedInterval, et cron en fonction des horaires. par exemple, au printemps, la configuration permet de créer un ScheduledThreadPoolExecutor qui utilise un pool de threads, mais ne permet pas les instances simultanées de la même annexe, tout comme vous désirez:
ici est la javadoc pour ScheduledThreadPoolExecutor::scheduleAtFixedRate qui précise:
remarque: cette fonctionnalité n'est pas vrai pour @Async tâches. le printemps va créer autant d'instances simultanées de ces si besoin (si il y a suffisamment de threads du pool).
@Scheduled foo(){Bar.baz();}} class Bar{ @Async baz(){/*work done here*/}}
en gardant à l'esprit que l'async pool de threads doit être assez grand pour tous vos chevauchement des travailleurs, et si vous êtes travailleurs ne sont jamais complets vous allez finir par épuiser même le plus grand pool de threads.