This project demonstrates how to implement scheduled tasks using Spring Boot with CRON expressions. It includes the steps necessary to enable scheduling and create scheduled tasks.
- Java 17 or higher
- Maven
- Spring Boot
To enable scheduling in your Spring Boot application, annotate your main application class with @EnableScheduling.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}Next, create a component class where you will define your scheduled tasks. Use the @Scheduled annotation on the methods you want to execute at specific intervals.
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Component
public class SimpleCronJob {
private static final DateTimeFormatter TIME_FORMATTER =
DateTimeFormatter.ofPattern("HH:mm:ss");
@Scheduled(fixedDelay = 10000) // Runs every 10 seconds after the last execution
public void executeTaskWithFixedDelay() {
String formattedTime = LocalDateTime.now().format(TIME_FORMATTER);
System.out.println("Task executed at (fixedDelay): " + formattedTime);
}
@Scheduled(fixedRate = 10000) // Runs every 10 seconds
public void executeTaskWithFixedRate() {
String formattedTime = LocalDateTime.now().format(TIME_FORMATTER);
System.out.println("Task executed at (fixedRate): " + formattedTime);
}
@Scheduled(cron = "*/10 * * * * *") // Runs every 10 seconds
public void executeTaskWithCron() {
String formattedTime = LocalDateTime.now().format(TIME_FORMATTER);
System.out.println("Task executed at (cron): " + formattedTime);
}
}fixedDelay: The method will be executed at a fixed interval after the completion of the previous execution.
For example, if you set fixedDelay = 10000, the method will wait for 10 seconds after the previous execution completes before running again.
fixedRate: The method will be executed at a fixed interval regardless of the completion of the previous execution.
For example, if you set fixedRate = 10000, the method will run every 10 seconds from the start of the last execution. If a task takes longer than 10 seconds, multiple instances of the task could run concurrently.
CRON expressions are a powerful way to schedule tasks in Unix-like operating systems and applications like Spring Boot. A CRON expression is a string consisting of six or seven fields (depending on the implementation) that represent different time units. Each field can contain specific values, ranges, or special characters that define when a scheduled task should run.
A CRON expression in Spring (and most CRON implementations) typically consists of six fields:
second minute hour day month day-of-weekHere's what each field represents:
- Second (0-59): The seconds within a minute.
- Minute (0-59): The minutes within an hour.
- Hour (0-23): The hour of the day.
- Day of Month (1-31): The day of the month.
- Month (1-12 or JAN-DEC): The month of the year.
- Day of Week (0-6 or SUN-SAT): The day of the week (0 for Sunday, 1 for Monday, etc.).
*(All values): Represents all values for a field. For example,*in the minute field means "every minute."?(No specific value): Used in the day-of-month and day-of-week fields to specify "no specific value." It is mainly used when you need to specify one of the two fields.-(Range): Used to specify a range of values. For example,1-5means from the 1st to the 5th.,(List): Used to specify a list of values. For example,MON,WED,FRImeans Monday, Wednesday, and Friday./(Increment): Used to specify increments. For example,*/5in the minute field means every 5 minutes.
Here are some common CRON expressions and their meanings:
- Every 10 seconds
*/10 * * * * *- Every Minute
0 * * * * *- Every 5 Minutes
0 */5 * * * *- Every 5 Minutes from 5 PM to 8 PM
0 0/5 17-20 * * ?- Every Hour
0 0 * * * *- Every Day at Midnight
0 0 0 * * *- Every Monday at 10 AM
0 0 10 * * MON- Every Month on the 1st at Midnight
0 0 0 1 * ?- Time Zone: By default, CRON expressions are evaluated in the server's local time zone. If you need to use a different time zone, you can specify it using the
zoneattribute of the@Scheduledannotation.
@Scheduled(cron = "0 0 12 * * ?", zone = "America/New_York")-
Concurrency: If your scheduled task takes longer to execute than the interval between executions, you may want to handle concurrency appropriately, possibly by configuring the task executor.
-
Error Handling: Ensure you have error handling in place for your scheduled tasks, as exceptions thrown during execution can cause the task to fail.# CronJob-Spring-Testing