SpringBoot 定时器异步配置
本文简单记录一下spring schedule 的异步配置,当业务执行时间大于定时器的定时时间的时候,schedule默认的单线程是不够用的,会导致定时的事件丢失。
启动类
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableAsync // 开启异步
@EnableCaching
@EnableScheduling
public class JucAppliction {
public static void main(String[] args) {
SpringApplication.run(JucAppliction.class,args);
}
}
配置线程池
@Configuration
@EnableAsync
//定时任务调用一个线程池中的线程。
public class ScheduleConfig {
private static final int corePoolSize = 15; // 核心线程数(默认线程数)
private static final int maxPoolSize = 100; // 最大线程数
private static final int keepAliveTime = 10; // 允许线程空闲时间(单位:默认为秒)
private static final int queueCapacity = 200; // 缓冲队列数
private static final String threadNamePrefix = "my-threadPool"; // 线程池名前缀
@Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名
public ThreadPoolTaskExecutor taskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(keepAliveTime);
executor.setThreadNamePrefix(threadNamePrefix);
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
}
任务执行类
@Service
public class TaskService {
@Scheduled(fixedRate = 1000)
@Async
void execute() throws InterruptedException {
System.out.println(Thread.currentThread().getName() + "--------------" + LocalTime.now() + "开始执行");
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName() + "--------------" + "执行完毕");
}
}
执行效果图