如何配置基于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已经解决。因此,@计划的
注释有一个新的区域属性来实现这一目的。
你的代码应该是这样的:
@Scheduled(cron = "0 0 14 * * *", zone = "GMT-5")
public void execute() {
// do scheduled job
}
“Zone”将是理想国家的时区。
下面是一个关于Spring计划任务的不错的教程:
https://www.baeldung.com/cron-expressions
从4.0版本开始,注释中的元素zone
@Sched的。
您可以将时区作为字符串插入,java可以接受它。util。时区
。
事实证明,我不能使用@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:
我有SimpleDateFormat构造函数作为
问题内容: 我经历了题为“以编程方式将AWS区域设置为1”的问题,但它没有提供我需要的所有答案。 Q1:我得到一个。我究竟做错了什么?还是我错过了错别字。 } 问题2:如果要从中构建Lambda函数,需要进行哪些代码更改?我知道如何创建lambda函数及其所需的角色。只是需要知道我编写的代码是否需要更改。我应该如何实现LambdaFuctionHandler类,如下所示: 问题答案: 关于Q1,请