Springboot中定时任务schedule配置

  |   0 评论   |   111 浏览

    在使用springboot框架的时候,很多场景需要用到定时任务来刷新缓存数据。一般情况下,我们会使用
    @Scheduled(cron = “0 */1 * * * *”)
    注解加上后面的时间。但是如果我们有多个定时任务的时候,这里会有一个问题。
    定时任务是单线程调度的,如果我们有多个定时任务的话,在框架内部是一个一个执行的
    1、配置中加入register
    for (SchedulingConfigurer configurer : configurers.values()) {
    configurer.configureTasks(this.registrar);
    }

    2、register加入调度器
    this.registrar.setTaskScheduler(this.beanFactory.getBean(TaskScheduler.class));
    
    3、调度器中配置了线程池
    protected void scheduleTasks() {
       if (this.taskScheduler == null) {
    	  this.localExecutor = Executors.newSingleThreadScheduledExecutor();
    	  this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
       }
       if (this.triggerTasks != null) {
    	  for (TriggerTask task : this.triggerTasks) {
    	  addScheduledTask(scheduleTriggerTask(task));
       }
    }
    

    从代码中看,线程池是一个单线程newSingleThreadScheduledExecutor。这个时候如果我们需要配置多线程调度,可以通过以下方式来处理:
    @Configuration
    public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    //设定一个长度10的定时任务线程池
    taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
    }
    }
    1、新增一个配置类,继承SchedulingConfigurer
    2、setScheduler 注册一个线程池,包含多个核心线程

    有了多线程之后,定时任务就可以并行进行了

    评论

    发表评论

    validate