提供春季@Scheduled的时区?

2022-08-31 16:59:10

如何为基于 Spring 的@Scheduled cron 作业配置时区?

背景:

我有一个每天执行一次的工作,比如下午2点,使用Spring的注释:@Scheduled

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

问题在于,2 PM在不同的服务器之间有所不同,因为Spring在内部使用。此外,JavaDoc 指出:TimeZone.getDefault()TimeZone.getDefault()

获取此主机的默认时区。默认时区的来源可能因实现而异。

换句话说,时区不是确定的。它可能取决于JVM实现、服务器时区配置、服务器位置和/或其他未知因素。因此,cron 作业在不同服务器上的不同时间触发,除非有办法显式设置应使用的时区?

我正在使用Spring 3.2.2。


更新

自春季 4 日起,春季 Jira 问题 SPR-10456 已得到解决。因此,注记具有一个新的区域属性,正是出于此目的。@Scheduled


答案 1

事实证明,我无法使用注释,但我实现了一个解决方法。在调度配置器的 JavaDoc 中,它指出:@Scheduled

[调度配置器是]通常用于设置在执行计划任务时要使用的特定 TaskScheduler Bean,或者用于以编程方式注册计划任务,而不是使用@Scheduled注释的声明性方法。

接下来,我更改了 cron 作业来实现接口,然后更新了我的配置文件以实现 ,如下所示:RunnableSchedulingConfigurer

@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()));
    }
}

有关详细信息,请阅读@EnableScheduling的 JavaDoc。


更新

自春季 4 日起,春季 Jira 问题 SPR-10456 已得到解决。因此,注释具有一个新的区域属性,正是出于此目的,例如@Scheduled

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

答案 2

注释中有元素,从4.0版本开始。zone@Scheduled

可以将时区作为字符串插入到 可以由 接受的字符串中。java.util.TimeZone


推荐