Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 356
Rajkishan Swami Avatar asked Apr 04 '17 10:04

Rajkishan Swami


People also ask

How do I enable spring boot scheduling?

You can enable scheduling simply by adding the @EnableScheduling annotation to the main application class or one of the Configuration classes.

Which annotation is used to enable the scheduler for spring boot application?

The @EnableScheduling annotation is used to enable the scheduler for your application. This annotation should be added into the main Spring Boot application class file.

What is fixed delay in spring scheduler?

Schedule a Task at Fixed Delay In this case, the duration between the end of the last execution and the start of the next execution is fixed. The task always waits until the previous one is finished. This option should be used when it's mandatory that the previous execution is completed before running again.


1 Answers

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.

like image 198
M. Deinum Avatar answered May 30 '23 22:05

M. Deinum