web-dev-qa-db-fra.com

Comment éviter les horaires qui se chevauchent au printemps?

@Scheduled(fixedDelay = 5000)
public void myJob() {
     Thread.sleep(12000);
}

Comment empêcher l'exécution de ce travail de printemps si la routine précédente n'est pas encore terminée?

32
membersound

Avec fixedDelay, la période est mesurée après la fin du travail, donc pas de soucis.

29
Jose Luis Martin

par défaut, spring utilise un exécuteur monothread. ainsi, aucune tâche @Scheduled ne se chevauchera jamais. même deux méthodes @Scheduled dans des classes complètement indépendantes ne se chevaucheront pas simplement parce que il n'y a qu'un seul thread pour exécuter toutes les tâches @Scheduled.

en outre, même si vous remplacez l'exécuteur par défaut par un exécuteur basé sur un pool de threads, ces exécuteurs retardent généralement l'exécution d'une instance de tâche jusqu'à la fin de l'instance précédemment planifiée. cela est vrai pour les horaires basés sur fixedDelay, fixedInterval et cron . par exemple, cette configuration de printemps créera un ScheduledThreadPoolExecutor qui utilise un pool de threads, mais n'autorise pas les instances simultanées de la même planification comme vous le souhaitez:

@Configuration
@EnableScheduling
...
public class MySpringJavaConfig {
    @Bean(destroyMethod = "shutdown")
    public Executor taskScheduler() {
        return Executors.newScheduledThreadPool(5);
    }
    ...
}

voici le javadoc pour ScheduledThreadPoolExecutor :: scheduleAtFixedRate qui spécifie:

Si une exécution de cette tâche prend plus de temps que sa période, les exécutions suivantes peuvent commencer tard, mais ne s'exécuteront pas simultanément.

remarque: cette fonctionnalité n'est pas valable pour @ Tâches asynchrones . spring créera autant d'instances simultanées que nécessaire (s'il y a suffisamment de threads dans le pool).

67
james turner