简介:当我们使用springboot自带的@Scheduled定时任务时,如果部署集群会导致定时任务的重复执行,同一时间的定时任务可能会没有执行。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 线程池配置
*
* @author
* 2021/11/16
*/
//异步执行
@EnableAsync
@Configuration
public class ExecutorConfig {
private static final String THREAD_PREFIX = "biz-executor-";//前缀不宜过长
@Bean("asyncExecutor")
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//线程池名称前缀
executor.setThreadNamePrefix(THREAD_PREFIX);
//线程池的默认线程
executor.setCorePoolSize(3);
//线程池最大线程数
executor.setMaxPoolSize(10);
//线程缓存队列
executor.setQueueCapacity(100);
//线程空闲时间
executor.setKeepAliveSeconds(60);
/*
线程池对拒绝任务的处理策略(rejection policy):
当线程池已经达到最大线程数量,没有空闲线程时,新任务该如何处理
可选策略:
CallerRunsPolicy:当线程池没有能力处理时直接在执行方法的调用线程中运行被拒绝的任务
如果执行程序已经关闭,将丢弃该任务.
AbortPolicy:处理程序遭到拒绝时将抛出 RejectedExecutionException
*/
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//等待所有任务调度完成在关闭线程池,保证所有的任务被正确处理
executor.setWaitForTasksToCompleteOnShutdown(true);
//线程池关闭时等待其他任务的时间,不能无限等待,确保应用最后能被关闭。而不是无限期阻塞
executor.setAwaitTerminationSeconds(60);
//线程池初始化
executor.initialize();
return executor;
}
}
在使用到的类上使用@Async("asyncExecutor")异步执行