Pergunta

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

Como posso impedir que isso primavera trabalho de execução se a rotina anterior ainda não está terminado?

Foi útil?

Solução

Com fixedDelay, o período é medido após a conclusão do trabalho, portanto, não se preocupe.

Outras dicas

por padrão, a primavera usa um single-threaded Executor.assim não há dois @tarefas Agendadas serão sempre se sobrepõem.até mesmo dois @Agendada métodos completamente alheios classes não se sobrepõem, simplesmente porque há apenas uma única thread para executar todos @tarefas Agendadas.

além disso, mesmo se você substituir o Executor padrão com um pool de threads baseado testamenteiro, os Executores, normalmente, irá atrasar a execução de uma tarefa instância até que o anteriormente agendada instância completa.isso é verdadeiro para fixedDelay, fixedInterval, e o cron com base horários.por exemplo, nesta primavera de configuração irá criar um ScheduledThreadPoolExecutor que usa um pool de threads, mas não permite que instâncias simultâneas do mesmo agendar assim como você desejar:

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

aqui é o javadoc para ScheduledThreadPoolExecutor::scheduleAtFixedRate que especifica:

Se qualquer execução desta tarefa demora mais do que o seu período, então subseqüentes execuções pode iniciar tarde, mas não simultaneamente executar.

nota:esta funcionalidade não se aplica @Assíncrona tarefas.a primavera vai criar quantas instâncias simultâneas aquelas, se necessário (se houver threads no pool).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top