¿Los métodos anotados @Scheduled de spring se ejecutan en diferentes subprocesos?

Tengo varios métodos anotados con @Scheduled (fixedDelay = 10000).

En el contexto de la aplicación, tengo esta configuración impulsada por la anotación:

 

El problema es que a veces parte de la ejecución del método se demora por segundos e incluso minutos.

Supongo que incluso si un método tarda un tiempo en terminar la ejecución, los otros métodos seguirían ejecutándose. Entonces no entiendo la demora.

¿Hay alguna manera de tal vez disminuir o incluso eliminar el retraso?

La documentación sobre la progtwigción dice:

Si no proporciona un atributo de tamaño de grupo, el grupo de subprocesos predeterminado solo tendrá un único subproceso.

Por lo tanto, si tiene muchas tareas progtwigdas, debe configurar el planificador, como se explica en la documentación, para tener un grupo con más subprocesos, para asegurarse de que una tarea larga no retrase todas las demás.

Para completar, el siguiente código muestra la forma más simple de configurar el progtwigdor con la configuración de java:

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

Cuando se desea más control, una clase @Configuration puede implementar SchedulingConfigurer .

Un método anotado con @Scheduled está destinado a ejecutarse por separado, en un hilo diferente en un momento determinado.

Si no ha proporcionado un TaskScheduler en su configuración, Spring usará

 Executors.newSingleThreadScheduledExecutor(); 

que devuelve un ScheduledExecutorService que se ejecuta en un único hilo. Como tal, si tiene varios métodos @Scheduled , aunque están progtwigdos, cada uno de ellos debe esperar a que el subproceso finalice la ejecución de la tarea anterior. Es posible que sigas recibiendo retrasos cada vez mayores a medida que la cola se llena más rápido de lo que se vacía.

Asegúrese de configurar su entorno de progtwigción con una cantidad adecuada de hilos.

puedes usar:

 @Bean() public ThreadPoolTaskScheduler taskScheduler(){ ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(2); return taskScheduler; }