Running each Spring Scheduler in its own thread

前端 未结 1 761
遥遥无期
遥遥无期 2020-12-28 09:38

I have multiple components with @Scheduled annotations, and I see that Spring only starts one at a time, even if they are scheduled to run on the same time.

相关标签:
1条回答
  • 2020-12-28 10:14

    You're right - by default scheduler uses a thread pool with size 1, so every task is being processed sequentially. You can it by configuring TaskScheduler bean with desired pool size. Consider following example:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.scheduling.TaskScheduler;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    
    import java.util.Date;
    
    @SpringBootApplication
    @EnableScheduling
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
        @Bean
        public TaskScheduler taskScheduler() {
            final ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
            scheduler.setPoolSize(10);
            return scheduler;
        }
    
    
        @Scheduled(fixedDelay = 2 * 1000L, initialDelay = 3 * 1000L)
        public void scheduled1() throws InterruptedException {
            System.out.println(new Date() + " " + Thread.currentThread().getName() + ": scheduled1");
            Thread.sleep(1000);
        }
    
        @Scheduled(fixedDelay = 3 * 1000L, initialDelay = 3 * 1000L)
        public void scheduled2() throws InterruptedException {
            System.out.println(new Date() + " " + Thread.currentThread().getName() + ": scheduled2");
            Thread.sleep(1000);
        }
    }
    

    It will run every scheduled task in a separate thread, for example:

    Tue Jul 18 20:21:50 CEST 2017 taskScheduler-1: scheduled2
    Tue Jul 18 20:21:50 CEST 2017 taskScheduler-2: scheduled1
    Tue Jul 18 20:21:53 CEST 2017 taskScheduler-1: scheduled1
    Tue Jul 18 20:21:54 CEST 2017 taskScheduler-3: scheduled2
    Tue Jul 18 20:21:56 CEST 2017 taskScheduler-2: scheduled1
    Tue Jul 18 20:21:58 CEST 2017 taskScheduler-4: scheduled2
    Tue Jul 18 20:21:59 CEST 2017 taskScheduler-1: scheduled1
    
    0 讨论(0)
提交回复
热议问题