Come prevenire gli orari sovrapposti in primavera?
-
21-12-2019 - |
Domanda
@Scheduled(fixedDelay = 5000)
public void myJob() {
Thread.sleep(12000);
}
.
Come posso impedire a questo lavoro a molla da eseguire se la precedente routine non è ancora finita?
Soluzione
Con fixedDelay
, il periodo è misurato dopo il completamento del lavoro, quindi non preoccuparti.
Altri suggerimenti
Per impostazione predefinita, la molla utilizza un singolo esecutore filettato. Quindi nessuna due attività @Scheduled si sovrappongono mai. Anche due metodi @scheduled in classi completamente non correlate non si sovrappongono semplicemente perché c'è solo un singolo filo per eseguire tutte le attività @Scheduled.
Inoltre, anche se si sostituisce l'esecutore predefinito con un eseetto basato su thread Pool, tali esecutori ritarderanno in genere l'esecuzione di un'istanza di attività fino al completamento dell'istanza precedentemente pianificata. Questo è vero per fissoDelay, fisso intervallo e cron basato su pianificazioni. Ad esempio, questa configurazione a molla creerà un ScheduledThreadPoolExecutor che utilizza un threadpool, ma non consente istanze concorrenti dello stesso programma proprio come desideri:
@Configuration
@EnableScheduling
...
public class MySpringJavaConfig {
@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
return Executors.newScheduledThreadPool(5);
}
...
}
.
Ecco il Javadoc per ScheduledThreadpoolExecutor :: ScheduleatFixedRate che specifica:
.Se qualsiasi esecuzione di questo compito richiede più tempo del suo periodo, le esecuzioni successive possono iniziare in ritardo, ma non eseguono contemporaneamente.
Nota: questa funzionalità non tiene true per le attività @Async . La primavera creerà tutte le istanze concomitanti di quelle necessarie (se ci sono fili sufficienti nella piscina).