To schedule job in spring boot application to run periodically, spring boot provides @EnableScheduling
and @Scheduled
annotations. Lets learn to use Spring boot @Scheduled annotation.
Let’s say you want to run job at every 10 seconds interval. You can achieve this job scheduling in below steps:
1. Add @EnableScheduling to Spring Boot Application class
Add @EnableScheduling
annotation to your spring boot application class. @EnableScheduling
is a Spring Context module annotation. It internally imports the SchedulingConfiguration
via the @Import(SchedulingConfiguration.class)
instruction
@SpringBootApplication @EnableScheduling public class SpringBootWebApplication { }
Read More : 4 ways to schedule tasks in Spring
2. Add Spring boot @Scheduled annotations to methods
Now you can add @Scheduled
annotations on methods which you want to schedule. Only condition is that methods should be without arguments.
ScheduledAnnotationBeanPostProcessor
that will be created by the imported SchedulingConfiguration
scans all declared beans for the presence of the @Scheduled
annotations.
For every annotated method without arguments, the appropriate executor thread pool will be created. This thread pool will manage the scheduled invocation of the annotated method.
2.1. Schedule task at fixed rate
Execute a task at a fixed interval of time:
@Scheduled(initialDelay = 1000, fixedRate = 10000) public void run() { logger.info("Current time is :: " + Calendar.getInstance().getTime()); }
Now observe the output in console:
2017-03-08 15:02:55 - Current time is :: Wed Mar 08 15:02:55 IST 2017 2017-03-08 15:03:05 - Current time is :: Wed Mar 08 15:03:05 IST 2017 2017-03-08 15:03:15 - Current time is :: Wed Mar 08 15:03:15 IST 2017 2017-03-08 15:03:25 - Current time is :: Wed Mar 08 15:03:25 IST 2017 2017-03-08 15:03:35 - Current time is :: Wed Mar 08 15:03:35 IST 2017
2.2. Schedule task at fixed delay
Configure a task to run after a fixed delay. In given example, the duration between the end of last execution and the start of next execution is fixed. The task always waits until the previous one is finished.
@Scheduled(fixedDelay = 10000) public void run() { logger.info("Current time is :: " + Calendar.getInstance().getTime()); }
2.3. Spring boot cron job example
@Scheduled annotation is very flexible and may take cron expression as well.
@Scheduled(cron = "0 10 10 10 * ?") public void run() { logger.info("Current time is :: " + Calendar.getInstance().getTime()); }
Drop me your questions on this spring task scheduler annotation example.
Happy Learning !!
For cron job example, is there a way to get all jobs created ? in order to see which one are created and running in runtime. I think the equivalent in shell command would be: crontab -e
Not sure if it is possible.
Hi Daniel,
For that you have to go with the quartz implementation and you must have to make it persistent so that you can store the auditing information as well.
why ?
what are advantages?
what are drawback ?
can I create a cron job using this annotation where my application will run on every morning at 6 pm
Yes, below is the cron expression for the same:
0 0 6 ? * MON *
Please visit cronmaker.com for any kind of cron expressions.
Hi Lokesh,
Does the scheduler stop/fail due to external reasons like thread pool max size reached etc. I ask this because my scheduler is expected to run indefinitely but it stops unexpectedly.
Regards,
Lakshmi Venkateswaran.
Hi Lakshmi, I have used it in one of my application at employer site and it is working since a year without failure at production. I have not faced any such issue. It seems there is some issue with the task it tries to run. Some StackOverflow threads also suggest so.
Can you please review the details of your task or else share if need second opinion.
How will i be able to disable a schedular in spring boot,when the uses wisheds to stop it.Is there any example code for this.
Kindly help!
Thanks,
Yaseen
Hi Lokesh,
Thanks for this article.
If I have option of running Linux/Unix cronjob and also Spring scheduler. Which one be preferred option to go for? Any pros and cons?
Thanks,
Parekh
I will prefer to have Job configuration inside application code, so that it is not machine dependent and a less team to communicate with 🙂 Technically, both will solve the purpose. You have to see pros/cons outside that.
Thanks Lokesh.