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 !!