在一个类中调用自己的方法,使用Async是由于AOP的规则,会导致异步失效(static也是失败的)
正确姿势:
将异步方法抽至另一个类中,将其注入到使用类直接掉用即可。
在配置自定义的线程池
package com.demo.config; import lombok.extern.slf4j.Slf4j; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; /** * @author : chenjie * @date : 2019-11-09 0:12 */ @Component @Slf4j public class AsyncConfig implements AsyncConfigurer { @Value("${thread.pool.corePoolSize:10}") private int corePoolSize; @Value("${thread.pool.maxPoolSize:20}") private int maxPoolSize; @Value("${thread.pool.keepAliveSeconds:30}") private int keepAliveSeconds; @Value("${thread.pool.queueCapacity:512}") private int queueCapacity; @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.setMaxPoolSize(maxPoolSize); executor.setKeepAliveSeconds(keepAliveSeconds); executor.setQueueCapacity(queueCapacity); executor.setWaitForTasksToCompleteOnShutdown(true); executor.setRejectedExecutionHandler((Runnable r, ThreadPoolExecutor exe) -> { log.warn("当前任务线程池队列已满."); }); executor.initialize(); return executor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return (ex, method, params) -> log.error("线程池执行任务发生未知异常.", ex); } }