springboot2.0以上调度器配置线程池的实现
一我们使用@EnableScheduling开启springtask调度器的时候,发现此调度器默认配置为单线程的。
二打开注解发现其配置信息在此SchedulingConfiguration类中。发现其创建了ScheduledTaskRegistrar类
研读代码不难发现调度器默认配置是如下代码,线程池为单线程的。
protectedvoidscheduleTasks(){
if(this.taskScheduler==null){
this.localExecutor=Executors.newSingleThreadScheduledExecutor();
this.taskScheduler=newConcurrentTaskScheduler(this.localExecutor);
}
if(this.triggerTasks!=null){
for(TriggerTasktask:this.triggerTasks){
addScheduledTask(scheduleTriggerTask(task));
}
}
if(this.cronTasks!=null){
for(CronTasktask:this.cronTasks){
addScheduledTask(scheduleCronTask(task));
}
}
if(this.fixedRateTasks!=null){
for(IntervalTasktask:this.fixedRateTasks){
addScheduledTask(scheduleFixedRateTask(task));
}
}
if(this.fixedDelayTasks!=null){
for(IntervalTasktask:this.fixedDelayTasks){
addScheduledTask(scheduleFixedDelayTask(task));
}
}
}
如何改变此配置呢?
如果想改变其中配置则只需要如下核心代码
packagecom.ccbobe.common.config;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.scheduling.annotation.EnableScheduling;
importorg.springframework.scheduling.annotation.SchedulingConfigurer;
importorg.springframework.scheduling.config.ScheduledTaskRegistrar;
importjava.util.concurrent.ScheduledExecutorService;
importjava.util.concurrent.ScheduledThreadPoolExecutor;
@EnableScheduling
@Configuration
publicclassSchedulerConfigimplementsSchedulingConfigurer{
@Bean
publicScheduledExecutorServiceconcurrentTaskScheduler(){
ScheduledThreadPoolExecutorexecutorService=newScheduledThreadPoolExecutor(20);
executorService.setMaximumPoolSize(20);
executorService.setRejectedExecutionHandler(newScheduledThreadPoolExecutor.CallerRunsPolicy());
returnexecutorService;
}
@Override
publicvoidconfigureTasks(ScheduledTaskRegistrartaskRegistrar){
taskRegistrar.setScheduler(concurrentTaskScheduler());
}
}
其中Scheduler支持两种,种分别是:TaskScheduler和ScheduledExecutorService
/**
*Setthe{@linkTaskScheduler}toregisterscheduledtaskswith,ora
*{@linkjava.util.concurrent.ScheduledExecutorService}tobewrappedasa
*{@codeTaskScheduler}.
*/
publicvoidsetScheduler(@NullableObjectscheduler){
if(scheduler==null){
this.taskScheduler=null;
}
elseif(schedulerinstanceofTaskScheduler){
this.taskScheduler=(TaskScheduler)scheduler;
}
elseif(schedulerinstanceofScheduledExecutorService){
this.taskScheduler=newConcurrentTaskScheduler(((ScheduledExecutorService)scheduler));
}
else{
thrownewIllegalArgumentException("Unsupportedschedulertype:"+scheduler.getClass());
}
}
完成以上配置,即可让springtask运行在多线程环境中。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。