我创建调度程序:
@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.我该怎么办?
根据文档,您可以通过调用setPoolSize()在运行时调整调度程序的大小(请参阅:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskScheduler.html#setPoolSize-int-)
问题是:您需要引用特定类ThreadPoolTaskScheduler
而不是接口TaskScheduler
。
您需要决定是否要将引用从TaskScheduler
更改为ThreadPoolTaskScheduler
而不破坏代码中的任何内容