Pregunta

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

¿Cómo puedo evitar que esto de la primavera de trabajo de si la rutina anterior aún no está terminado?

¿Fue útil?

Solución

Con fixedDelay, el período se mide después de la finalización del trabajo, por lo que no se preocupe.

Otros consejos

de forma predeterminada, la primavera utiliza un único subproceso Ejecutor.así que no hay dos @tareas Programadas nunca se superponen.incluso dos @Programada métodos completamente ajenos clases no se superponen, simplemente porque sólo hay un único hilo para ejecutar todas las @de tareas Programadas.

además, incluso si usted reemplazar el valor predeterminado Ejecutor con un grupo de subprocesos basado ejecutor, los Ejecutores se suelen retrasar la ejecución de una instancia de la tarea hasta que el anteriormente instancia programada completa.esto es cierto para fixedDelay, fixedInterval, y cron basado en las programaciones.por ejemplo, esta configuración del resorte de la voluntad de crear un ScheduledThreadPoolExecutor que utiliza un threadpool, pero no permite a instancias simultáneas de la misma programación como usted desea:

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

aquí está el javadoc para ScheduledThreadPoolExecutor::scheduleAtFixedRate que se especifica:

Si la ejecución de esta tarea se lleva más de su período, a continuación, en las siguientes ejecuciones de mayo de comienzo tarde, pero no al mismo tiempo ejecutar.

nota:esta funcionalidad no es cierto para el @Async tareas.la primavera va a crear tantas instancias simultáneas de aquellos, según sea necesario (si hay suficientes hilos en la piscina).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top