I create schedule task without @scheduled annotation instead using taskregistrar (as I get more flexibility in cancelling, dynamically changing the delay etc - please don't focus on why I use taskregistrar). But then I noticed that TaskScheduler has no effect while doing so. Code is given below
//in my SchedulingConfigurer
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("proc-task-pool-");
scheduler.setPoolSize(10);//No use - always use 8
scheduler.initialize();
taskRegistrar.setTaskScheduler(scheduler);//commenting this line also result in same behavior
taskRegistrar.scheduleFixedRateTask(new FixedRateTask(myService::processData,
1000L,
0L));
}
//in my service class
@Async
public void processData() {
log.info("inside processData {} {}", Thread.currentThread().getName(), LocalDateTime.now());
try {
Thread.sleep(20000L);
} catch (InterruptedException e) {
log.error("InterruptedException ");
}
}
Whether I set a custom scheduler or not, I noticed that my fixedRateTask is always processed by 8 threads. Below is the console log
inside processData task-1 2020-05-12T10:33:31.762
inside processData task-2 2020-05-12T10:33:32.743
inside processData task-3 2020-05-12T10:33:33.747
inside processData task-4 2020-05-12T10:33:34.742
inside processData task-5 2020-05-12T10:33:35.742
inside processData task-6 2020-05-12T10:33:36.739
inside processData task-7 2020-05-12T10:33:37.742
inside processData task-8 2020-05-12T10:33:38.743
inside processData task-1 2020-05-12T10:33:51.762
inside processData task-2 2020-05-12T10:33:52.744
inside processData task-3 2020-05-12T10:33:53.747
inside processData task-4 2020-05-12T10:33:54.743
inside processData task-5 2020-05-12T10:33:55.743
What went wrong?
EDIT
m-deinum's comment below helped me to resolve the problem.
@Bean(destroyMethod = "shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
this.scheduledTask = taskRegistrar.scheduleFixedRateTask(new FixedRateTask(myService::processData,
configParams.getFixedratedelay(),
0L));
}
EDIT 2
m-deinum's another comment helped me to optimize. I removed the TaskExecutor bean altogether and used the following configuration property.
spring.task.execution.pool.core-size=20=100 //I wrongly used scheduling.pool.size earlier