package com.common.base.config; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.lang.reflect.Method; import java.util.concurrent.Executor; /** * @Auther: tony_t_peng * @Date: 2020-08-10 10:06 * * 支持异步线程 @Async,@Async的线程有线程池维护 * 被@Async的方法在独立线程调用,不能被@ControllerAdvice全局异常处理器捕获 * 异常需要自己手动处理 */ @Configuration @EnableAsync public class BaseAsyncConfigurer implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //核心线程池数量,方法: 返回可用处理器的Java虚拟机的数量。 executor.setCorePoolSize(Runtime.getRuntime().availableProcessors()); //最大线程数量 executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors()*5); //线程池的队列容量 executor.setQueueCapacity(Runtime.getRuntime().availableProcessors()*2); //线程名称的前缀 executor.setThreadNamePrefix("this-excutor-"); // setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务 // CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行 //executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } /*异步任务中异常处理*/ @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return (Throwable ex, Method method, Object... params)->{ //todo 异步方法异常处理 System.out.println("class#method: " + method.getDeclaringClass().getName() + "#" + method.getName()); System.out.println("type : " + ex.getClass().getName()); System.out.println("exception : " + ex.getMessage()); }; } }
支持springboot使用@Async的注解,@Async的注解是另外启一个线程去执行方法,无法被@RestControllerAdvice该注解获取异常,异常处理需要自己手动处理。
springboot异步线程管理,实现AsyncConfigurer
原文:https://www.cnblogs.com/ptcnblog/p/13468932.html