Proporcionar zona horaria a Spring @ Programado?


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

Antecedentes:

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

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

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

Obtiene la zona horaria predeterminada para este host. La fuente del valor predeterminado La zona horaria 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 / u otros factores desconocidos. En consecuencia, el trabajo cron se activa en diferentes momentos en diferentes servidores, a menos que haya una manera de establecer explícitamente qué zona horaria se debe usar?

Estoy usando Spring 3.2.2.


Update

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

Author: matsev, 2013-04-10

3 answers

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

[SchedulingConfigurer es] Típicamente usado para establecer un TaskScheduler bean específico para ser usado cuando se ejecutan tareas programadas o para registrar tareas programadas de manera programática en lugar del enfoque declarativo de usar la anotación @Scheduler.

A continuación, cambié el trabajo cron a implementar la interfaz Runnable y luego actualizar mi archivo de configuración para implementar la 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 JavaDoc de @EnableScheduling para más información.


Actualización

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

 22
Author: matsev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-21 05:21:00

Hay un elemento zone 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.

 17
Author: Vlasec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-10 09:24:09

Dudo que desee diferentes trabajos o partes de la aplicación para usar diferentes zonas horarias. Suponiendo que desee que todo sea coherente y seco, configure el sistema operativo en todos los servidores para que tenga una zona horaria coherente o configure el usuario.propiedad del sistema Java de zona horaria para todos los servidores de aplicaciones. Administrar la configuración de forma centralizada (SO, servidor de aplicaciones), y para eso puppet y chef pueden ser muy útiles.

 0
Author: Stevo Slavić,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-14 09:48:20