scheduled minutes expressions examples every annotation java spring cron timezone scheduling

java - minutes - Proporcionar zona horaria a Spring @Scheduled?



spring scheduled annotation cron (3)

Dudo que quieras diferentes trabajos o partes de la aplicación para usar diferentes zonas horarias. Suponiendo que desea que todo sea coherente y SECO, configure el sistema operativo en todos los servidores para tener una zona horaria coherente o establezca la propiedad del sistema Java del usuario.timezone para todos los servidores de aplicaciones. Gestione centralmente la configuración (SO, servidor de aplicaciones), y para ese títere y chef puede ser muy útil.

¿Cómo puedo configurar la zona horaria para un trabajo cron @Scheduled basado en Spring?

Fondo:

Tengo un trabajo que se ejecuta una vez al día, digamos a las 2 @Scheduled . @Scheduled , @Scheduled anotación @Scheduled de Spring @Scheduled :

@Scheduled(cron = "0 0 14 * * *") public void execute() { // do scheduled job }

El problema es que 2 PM difiere entre servidores diferentes, porque Spring usa en TimeZone.getDefault() internally . Además, el JavaDoc de TimeZone.getDefault() establece que:

Obtiene la TimeZone predeterminada para este host. La fuente del TimeZone predeterminado puede variar con la implementación.

En otras palabras, la zona horaria no está determinada. Puede depender de la implementación de JVM, la configuración de la zona horaria del servidor, la ubicación del servidor y otros factores desconocidos. En consecuencia, el trabajo cron se desencadena en diferentes momentos en diferentes servidores, a menos que haya una forma de establecer explícitamente qué zona horaria debe usarse.

Estoy usando Spring 3.2.2.

Actualizar

A partir de la primavera 4, el problema de Spring Jira SPR-10456 se ha resuelto. En consecuencia, la anotación @Scheduled tiene un nuevo atributo de zone exactamente para este propósito.


Hay una zone elementos en la anotación @Scheduled , a partir de la versión 4.0.

Puede insertar una zona horaria como una cadena que puede ser aceptada por java.util.TimeZone .


Resultó que no pude usar la anotación @Scheduled , pero implementé una @Scheduled . En el JavaDoc del SchedulingConfigurer se afirma que:

[SchedulingConfigurer] Se usa normalmente para establecer un bean TaskScheduler específico que se utilizará al ejecutar tareas programadas o para registrar tareas programadas de forma programática, en lugar del enfoque declarativo de utilizar la anotación @Scheduled.

Luego, cambié el trabajo cron para implementar la interfaz Runnable y luego actualicé mi archivo de configuración para implementar SchedulingConfigurer , ver a continuación:

@Configuration @EnableScheduling @ComponentScan("package.that.contains.the.runnable.job.bean") public class JobConfiguration implements SchedulingConfigurer { private static final String cronExpression = "0 0 14 * * *"; private static final String timeZone = "CET"; @Autowired private Runnable cronJob; @Bean CronTrigger cronTrigger() { return new CronTrigger(cronExpression, TimeZone.getTimeZone(timeZone)); } @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addCronTask(new CronTask(job, cronTrigger())); } }

Por favor, lea el @EnableScheduling de @EnableScheduling para más información.

Actualizar

A partir de la primavera 4, el problema de Spring Jira SPR-10456 se ha resuelto. En consecuencia, la anotación @Scheduled tiene un nuevo atributo de zone exactamente para este propósito.