我创建调度程序:
@Bean
TaskScheduler taskScheduler(){
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(5);
threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
threadPoolTaskScheduler.setThreadNamePrefix("Test-");
return threadPoolTaskScheduler;
}
我接下来等:
每1秒钟触发我的调度方法并启动5个线程(PoolSize(5)
),每个线程都会成为我的逻辑。为此,我在@Component bean中创建了计划方法:
@Slf4j
@Component
public class MyScheduler {
private final TaskScheduler taskScheduler;
public MyScheduler(TaskScheduler taskScheduler) {
this.taskScheduler = taskScheduler;
}
@Scheduled(fixedDelay = 1000L)
public void test(){
taskScheduler.schedule(() -> {
try {
Thread.sleep(9000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("test");
}, new Date());
}
}
工作正常。
每1秒钟启动test()
方法并工作9秒钟。在5 secon上,我有完整的threadPool并等待第一个空闲线程。如果设置sleep(5000L)
-threadPool无法填充。
但是现在我需要在运行时更改poolSize。例如从5到10。我该怎么办?
答案 0 :(得分:0)
根据文档,您可以在运行时通过调用setPoolSize()来调整调度程序的大小(请参阅:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskScheduler.html#setPoolSize-int-)
问题是:您需要引用特定的类ThreadPoolTaskScheduler
而不是接口TaskScheduler
。
您需要确定是否要将引用从TaskScheduler
更改为ThreadPoolTaskScheduler
,而又不会破坏代码中的内容