mem*_*und 27 java spring spring-boot
我正在使用spring-boot
和@Scheduled
注释来执行某些任务.
如何在spring-boot中找出默认的计划任务的默认池大小?
原因:以下类不并行执行作业,而是一个接一个地执行.也许默认情况下只配置一个线程执行程序?
@Service
public class ZipFileTesterAsync {
@Scheduled(fixedDelay = 60000, initialDelay = 500)
public void run() throws Exception {
System.out.println("import 1");
TimeUnit.MINUTES.sleep(1);
System.out.println("import 1 finished");
}
@Scheduled(fixedDelay = 60000, initialDelay = 1000)
public void run2() throws Exception {
System.out.println("import 2");
TimeUnit.MINUTES.sleep(1);
}
}
Run Code Online (Sandbox Code Playgroud)
结果:第一个完成后执行第二个作业.
Ari*_* Z. 47
是的,@Scheduled
默认情况下所有方法共享一个线程.可以通过定义@Configuration
如下所示来覆盖此行为:
@Configuration
public class SchedulingConfigurerConfiguration implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(100);
taskScheduler.initialize();
taskRegistrar.setTaskScheduler(taskScheduler);
}
}
Run Code Online (Sandbox Code Playgroud)
此示例确保所有@Scheduled
方法共享大小为100的线程池.
rob*_*thy 30
默认池大小为1,可以在application.properties
science springboot2.1.0 中通过更改 的值来设置池大小spring.task.scheduling.pool.size
。
spring.task.scheduling.pool.size=20
Run Code Online (Sandbox Code Playgroud)
当触发周期小于执行持续时间时,相同的任务将被串行执行。并且 Spring Boot 会以最多 20 个线程并行执行不同的任务。
spring-boot 中默认的调度程序池大小只有1。
在org.springframework.scheduling.config.ScheduledTaskRegistrar
:
/**
* Schedule all registered tasks against the underlying
* {@linkplain #setTaskScheduler(TaskScheduler) task scheduler}.
*/
@SuppressWarnings("deprecation")
protected void scheduleTasks() {
if (this.taskScheduler == null) {
this.localExecutor = Executors.newSingleThreadScheduledExecutor();
this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
}
...
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18478 次 |
最近记录: |