Question

@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?

Était-ce utile?

La solution

Avec fixedDelay, la période est mesurée après l'achèvement de travail, donc pas de soucis.

Autres conseils

Par défaut, le ressort utilise un exécuteur unique à filetage. Donc, aucune tâche de deux @schedulée ne se chevauchent jamais. Même deux méthodes @schedulées dans des classes entièrement non liées ne se chevauchent pas simplement parce que il n'y a qu'un seul fil pour exécuter toutes les tâches @schedulées.

En outre, même si vous remplacez l'exécuteur par défaut avec un exécuteur basée sur la piscine de thread, ces exécuteurs retarderont généralement l'exécution d'une instance de tâche jusqu'à ce que l'instance précédemment planifiée soit terminée. Ceci est vrai pour fixeDelay, communInterval et cron . Par exemple, cette configuration de ressort créera un ScheduledTheadPoolEcutorEcutor qui utilise un threadpool, mais n'autorise pas les instances simultanées du même horaire que vous désirez:

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

Voici le Javadoc pour planifiéeTheadpoolEcutor :: planifiantAtfixeDrate qui spécifie:

Si une exécution de cette tâche prend plus de temps que sa période, les exécutions ultérieures peuvent commencer tardivement, mais ne seront pas exécutées simultanément.

Remarque: cette fonctionnalité ne contient pas de vrai pour les tâches @Async . Le printemps créera autant d'instances simultanées de ceux que nécessaire (s'il y a suffisamment de threads dans la piscine).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top