Rajkishan Swami
Rajkishan Swami

Reputation: 3759

Spring-boot scheduler runs without @EnableScheduling annotation

I was following this example to create a scheduled task in a sample project: https://spring.io/guides/gs/scheduling-tasks

It says, @EnableScheduling ensures that a background task executor is created. Without it, nothing gets scheduled.

But, by mistake i didn't use it. How come it still works?

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>demo</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Other Classes:

@SpringBootApplication
public class DemoApplication {

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

@Component
public class ScheduledTaskRunner {

    Logger log = LoggerFactory.getLogger(ScheduledTaskRunner.class);

    @Scheduled(cron = "0/1 * * * * *")
    public void run(){
        log.info("Hello");
    }
}

Isn't the scheduled task supposed to not run?

Upvotes: 11

Views: 6507

Answers (1)

M. Deinum
M. Deinum

Reputation: 124441

Your code added the spring-boot-starter-actuator when that is added a scheduler is added as well. This scheduler is used by the actuator to schedule the automatic export of the metrics.

The code for this is in the MetricExportAutoConfiguration and has been added in Spring Boot 1.3.0.

So if you remove the actuator scheduling won't work anymore.

Upvotes: 18

Related Questions