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?

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top