Let’s say you want to schedule background tasks in your application , may be every ten minutes or at a fixed time every day or during weekends.
How do you do that in Spring Boot?
Spring Boot provides a simple and straightforward solution:
By just using @Scheduled annotation.
Here are the steps in detail:
STEP1: Add spring-boot-starter dependency
Add the below dependency which provides the @Scheduled annotation:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
STEP2: Add @EnableScheduling annotation on the main class
Along with @SpringBootApplication annotation add @EnableScheduling annotation to the main class:
package com.example.scheduler; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling public class SpringschedulerApplication { public static void main(String[] args) { SpringApplication.run(SpringschedulerApplication.class, args); } }
STEP3: Add @Scheduled annotation to the method to be scheduled
Add @Scheduled annotation to the method you want to schedule .
You can pass a parameter to this annotation to customize how to schedule the task:
You want to run it at specified intervals?
Use fixedRate parameter.
You want to provide a specific delay between each run?
Use fixedDelay paramter.
You want to schedule at a particular time/day/day of week/day of month?
Use cron parameter
Here are three examples for each use case:
package com.example.scheduler; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class Scheduler { //run every 2 seconds @Scheduled(fixedRate = 2000) public void run1() { System.out.println("Hello Fixed Rate -------------> Time now is : " + LocalTime.now().format(DateTimeFormatter.ofPattern("hh mm ss"))); } //wait for 1 second between successive runs @Scheduled(fixedDelay = 1000) public void run2() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println( "Hello Fixed Delay, Time now is : " + LocalTime.now().format(DateTimeFormatter.ofPattern("hh mm ss"))); } //run during the first second every minute every hour every day of month //every month every day of week @Scheduled(cron = "0 * * * * *") public void run3() { System.out.println("Hello Cron Job **********************> Time now is : " + LocalTime.now().format(DateTimeFormatter.ofPattern("hh mm ss"))); } }
Both fixedRate and fixedDelay are in milliseconds.
cron parameter accepts 6 input points.
First one is second (0 to 59)
Second one is minute (0 to 59)
Third one is hour (0 to 23)
Fourth one is day of month (1-31)
Fifth one is month (1 – 12) or (JAN -DEC)
Sixth one is day of week (0 to 7) or (MON – SUN) (Either 0 or 7 can be used to denote Sundays)
Here are few more examples:
https://spring.io/blog/2020/11/10/new-in-spring-5-3-improved-cron-expressions
Here is the output I got after starting the application:

Fixed Rate option is printing the output every second (the time printed out sometimes overlaps – prints the same time successively during successive seconds since it is very quick)
Fixed Delay option is printing every three seconds (waiting for 1 second after the method finishes in 2 seconds)
Cron job option is printing during the first second of every minute.
Here is the link to the entire code: