springBoot中定时器注解@Schedule不生效问题

springboot以其方便简单的使用各种中间件收到了广大开发者的欢迎,最近也是在用springboot开发定时器,因为不是第一次用@Schedule注解了所以完全没想到会在这个地方出问题。
本地开发完之后设置一个临近的时间点,测试完毕,一切正常。发布到服务器上傻眼了,设置的凌晨五点到点了却一个没执行。聪明的朋友可能已经看出来我写了不止一个。问题就出在了这个地方,下面记录一下原因和解决办法。
因为本地测试时是单个测试的,时间节点也不同所以没有发现问题。发布到服务器上因为定时任务较多并且时间设置的重复度比较高,大部分都是凌晨五点导致定时任务阻塞。因为定时任务默认是单线程执行,当一个任务较慢时多个任务都会阻塞。下面是两个解决办法:

  1. 调整定时任务的执行时间,错峰执行。
  2. 增加一个配置类,配置定时器为多线程执行,代码如下

@Configuration
public class ScheduleConfig implements SchedulingConfigurer{

@Override
public void configureTasks(ScheduleTaskRegistrar scheduledTaskRegistrar){
    int maxPoolSize = 4;
    int corePoolSize =(scheduledTaskRegistrar.getCronTaskList().size() > maxPoolSize) ? maxPoolSize : scheduledTaskRegistrar.getCronTaskList().size()
    ScheduledExecutorService scheduledExecutorService 
    = new ScheduledThreadPoolExecutor(corePoolSize,new BasicThreadFactory.Builder().namingPattern("******").daemon(true).build());
    scheduledTaskRegistrar.setScheduler(scheduledExecutorService)
    
}

}

上一篇:[WorkLog] InnoDB Faster truncate/drop table space


下一篇:Flink线上问题汇总篇(2)