当前位置: 首页 > 知识库问答 >
问题:

提供时区到Spring@计划?

仲孙俊贤
2023-03-14

如何配置基于Spring的@计划cron作业的时区?

背景:

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

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

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

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

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

我使用的是Spring 3.2.2。

最新消息

从Spring 4开始,Spring Jira问题SPR-10456已经解决。因此,@计划的注释有一个新的区域属性来实现这一目的。

共有3个答案

法景明
2023-03-14

你的代码应该是这样的:

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

“Zone”将是理想国家的时区。

下面是一个关于Spring计划任务的不错的教程:

https://www.baeldung.com/cron-expressions

乌翰学
2023-03-14

从4.0版本开始,注释中的元素zone@Sched的。

您可以将时区作为字符串插入,java可以接受它。util。时区

傅旺
2023-03-14

事实证明,我不能使用@Scheduled注释,但我实现了一种变通方法。在SchedulingConfigurer的JavaDoc中指出:

[SchedulingConfigurer]通常用于设置执行计划任务时要使用的特定TaskScheduler bean,或以编程方式注册计划任务,而不是使用@scheduled注释的声明性方法。

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

@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。

最新消息

从Spring4日起,Spring Jira问题SPR-10456已得到解决。因此,@Scheduled注释有一个新的区域属性,正好用于此目的,例如:。

@Scheduled(cron = "0 0 14 * * *", zone = "CET")
public void execute() {
    // do scheduled job
}
 类似资料:
  • 问题内容: 如何为基于Spring的@Scheduled cron作业配置时区? 背景: 我有一份使用Spring的注释每天执行一次的工作,例如下午2点: 问题是2PM在不同服务器之间不同,因为Spring在 内部使用。此外,JavaDoc中的 规定: 获取此主机的默认TimeZone。默认TimeZone的来源可能会因实现方式而异。 换句话说,未确定时区。它可能取决于JVM实现,服务器时区配置,

  • 我有以下方法返回AmazonS3上传文件。在本地环境中,我必须连接到不同区域的s3 bucket,但在其他环境中,s3 bucket和应用程序代码是相同的aws区域。 当我从本地运行时,我得到了以下异常,我错过了什么? 原因:com.amazonaws.sdkclientexception:无法通过区域提供程序链找到区域。必须在生成器或安装环境中提供显式区域才能提供区域。在com.amazonaw

  • 我有一个用Spring Boot和Maven构建的简单java web应用程序。每次我在pom中修改我的工件版本时。xml my web serviceendpoint更改。 例如,假设在控制器类中我有@Request estMap("/api/v1/")注释,并假设以下pom摘录 webserviceendpoint将是http://localhost/myConv-1.0.0/api/v1/.

  • 如何为Spring AOP方面提供超时执行? MyAspect的记录器方法的执行时间不应超过30秒,如果不是,我会想要停止方法执行。我该怎么做? MyAspect代码: myService接口: MyServiceImpl:

  • 问题内容: 我经历了题为“以编程方式将AWS区域设置为1”的问题,但它没有提供我需要的所有答案。 Q1:我得到一个。我究竟做错了什么?还是我错过了错别字。 } 问题2:如果要从中构建Lambda函数,需要进行哪些代码更改?我知道如何创建lambda函数及其所需的角色。只是需要知道我编写的代码是否需要更改。我应该如何实现LambdaFuctionHandler类,如下所示: 问题答案: 关于Q1,请