异步调用
@EnableAsync注解开启异步调用
如果不做任何配置,会使用TaskExecutionAutoConfiguration 配置的线程池来执行
如果想使用自己配置的线程池,可以自己注入实现了Executor接口的bean;同时在@Async(beanName) 指定自己的线程池;
或者向容器内注入 ThreadPoolTaskExecutor,返回线程,此线程池会在@Async没有指定使用哪个线程池时使用;
/**
* 注入异步线程使用的线程池
*
* @return 线程池
*/
@Lazy
@Bean
public Executor cpuPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix("Async-Pool");
executor.setCorePoolSize(10);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(2000);
executor.initialize();
return executor;
}
异步异常处理: 实现AsyncConfigurer 接口,并注入这个bean
@SpringBootConfiguration
@EnableAsync
@Slf4j
public class AsyncConf implements AsyncConfigurer {
/**
* 异步线程异常处理
*
* @return 异常handler
*/
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) -> {
log.error("exec {}.{} error,param {},exception message {}",
method.getDeclaringClass().getName(), method.getName(),
Arrays.toString(params), ex);
};
}