Scheduling code execution in Spring Boot

This short article will teach you how you can easily schedule code execution in a Spring Boot application with the least amount of effort.

Firstly, you can schedule code execution in Spring Boot via the @EnableScheduling annotation. Behind the hoods, this meta-annotation internally imports the SchedulingConfiguration.

Next, the ScheduledAnnotationBeanPostProcessor will scan the declared Spring Beans for the presence of the @Scheduled annotations. For every method that includes the @Schedule annotation, the appropriate executor thread pool will be created. It will manage the scheduled invocation of that method.

Here’s an example which will fire the execution of a method every 30 seconds:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

@SpringBootApplication
@EnableScheduling

public class MainApplication {

  @Scheduled(fixedRate = 30000)
  public void run() {
    System.out.println("Called scheduler!");
  }

  public static void main(String[] args) {
    SpringApplication.run(MainApplication.class, args);
  }
}

On the other hand, if you want to schedule the Job after an initial delay (in ms), then you can add the initialDelay parameter in your @Scheduled method:

@Scheduled(initialDelay = 1000, fixedRate = 30000) 
public void run() { 
   System.out.println("Called scheduler!"); 
}

Using different formats to schedule tasks

There are other formats you can use to define the rate of scheduling. For example, you can use the ISO Duration format:

@Scheduled(fixedDelayString = "PT10S"))

Besides, you can also use a cron expression to define the rate of scheduling. For example, to schedule the execution every 5 minutes:

@Scheduled(cron="0 */5 * ? * *")

Conditional Scheduling

In order to configure a condition on the scheduling, the recommended approach is to use the @ConditionalOnProperty annotation along with the @EnableScheduling.

In a nutshell, the @ConditionalOnProperty enables bean registration only if a system property is present and has a specific value.

@EnableScheduling
@Configuration
@ConditionalOnProperty(name = "enable.scheduling")
public class MainApplication {}

Next, to allow the scheduling of jobs, you need to provide the following property in your application.properties (or via -D) :

enable.scheduling = true

Monitoring scheduled tasks

Finally, you can use the Actuator to monitor the list of scheduled tasks.

Include the actuator dependency in your project:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

The /scheduledtasks endpoint provides details about every scheduled task within our application:

"scheduledtasks": {
"href": "http://localhost:8080/actuator/scheduledtasks",
"templated": false
},