Spring Scheduler
Jul 26, 2021
Purpose
The purpose of this document is to learn and play around with spring's scheduling capabilities using @EnableScheduling annotation.
Use Case
You have 3 tasks to perform every minute and each task takes 10 seconds to complete.
How would you do it?
Add @EnableScheduling annotation to the class with @SpringBootApplication. Now @Configuration classes with @Scheduled methods will be enabled. (todo - any class)
- 
Go to https://start.spring.io/ and create a new application - scheduling.
 - 
Add @EnableScheduling to SchedulingApplication.
 - 
Add 3 @Configuration classes - One, Two & Three with a work() method.
@Scheduled(fixedDelay = 60000) void work() throws InterruptedException { LOG.info("first one"); } - 
Run it.
2021-07-26 07:45:03.687 INFO 91778 --- [ scheduling-1] com.example.scheduling.schedulers.One : first one 2021-07-26 07:45:03.687 INFO 91778 --- [ scheduling-1] com.example.scheduling.schedulers.Two : second one 2021-07-26 07:45:03.687 INFO 91778 --- [ scheduling-1] com.example.scheduling.schedulers.Three : third one 
The “first one”, “second one” and the “third one” log almost simultaneously.
You might have noticed “scheduling-1” associated with the three logs, which means a single thread worked on all of them. Is this a problem?
Let's find out by adding Thread.sleep(10000); before the log.
2021-07-26 07:59:35.899  INFO 91831 --- [   scheduling-1] com.example.scheduling.schedulers.One    : first one
2021-07-26 07:59:45.900  INFO 91831 --- [   scheduling-1] com.example.scheduling.schedulers.Two    : second one
2021-07-26 07:59:55.900  INFO 91831 --- [   scheduling-1] com.example.scheduling.schedulers.Three  : third one
Yes! There is a delay.
We're gonna need more threads!
Enter SchedulingConfigurer interface which helps us customize the executor and define more threads.
@Configuration
public class SchedulingConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar str) {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        scheduler.setThreadNamePrefix("scheduled-task-pool-");
        scheduler.initialize();
        str.setTaskScheduler(scheduler);
    }   
}
Add this class and run it and everything is gooooood again.
2021-07-26 08:04:03.479  INFO 91877 --- [led-task-pool-2] com.example.scheduling.schedulers.Two    : second one
2021-07-26 08:04:03.479  INFO 91877 --- [led-task-pool-1] com.example.scheduling.schedulers.One    : first one
2021-07-26 08:04:03.479  INFO 91877 --- [led-task-pool-3] com.example.scheduling.schedulers.Three  : third one
Reference: