Provide time zone to Spring @Scheduled?
Your code should be like this:
@Scheduled(cron = "0 0 14 * * *", zone = "GMT-5")
public void execute() {
// do scheduled job
}
"Zone" is gonna be the desired country's timezone.
Here is a nice tutorial about scheduled tasks with Spring:
https://www.baeldung.com/cron-expressions
It turned out that I could not use the @Scheduled
annotation, but I implemented a work-around. In the JavaDoc of the SchedulingConfigurer it is stated that:
[SchedulingConfigurer is] Typically used for setting a specific TaskScheduler bean to be used when executing scheduled tasks or for registering scheduled tasks in a programmatic fashion as opposed to the declarative approach of using the @Scheduled annotation.
Next, I changed the cron job to implement the Runnable
interface and then updated my configuration file to implement the SchedulingConfigurer
, see below:
@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()));
}
}
Please read the JavaDoc of the @EnableScheduling for more information.
Update
As of Spring 4, Spring Jira issue SPR-10456 has been resolved. Consequently, the @Scheduled
annotation has a new zone attribute for exactly this purpose, e.g.
@Scheduled(cron = "0 0 14 * * *", zone = "CET")
public void execute() {
// do scheduled job
}
You can also use time zone with @Scheduled
tag in spring-boot like this :
@Scheduled(cron = "0 0 14 * * *" , zone = "GMT+5:00")
public void execute() {
// do the scheduled job
}
There is element zone
in annotation @Scheduled
, starting from version 4.0.
You can insert a timezone as a string that can be accepted by java.util.TimeZone
.