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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。