package org.dromara.common.core.config; import cn.hutool.core.util.ArrayUtil; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.core.task.VirtualThreadTaskExecutor; import org.springframework.scheduling.annotation.AsyncConfigurer; import java.util.Arrays; import java.util.concurrent.Executor; /** * 异步配置 *
* 如果未使用虚拟线程则生效 * * @author Lion Li */ @AutoConfiguration public class AsyncConfig implements AsyncConfigurer { /** * 自定义 @Async 注解使用系统线程池 */ @Override public Executor getAsyncExecutor() { if(SpringUtils.isVirtual()) { return new VirtualThreadTaskExecutor("async-"); } return SpringUtils.getBean("scheduledExecutorService"); } /** * 异步执行异常处理 */ @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return (throwable, method, objects) -> { throwable.printStackTrace(); StringBuilder sb = new StringBuilder(); sb.append("Exception message - ").append(throwable.getMessage()) .append(", Method name - ").append(method.getName()); if (ArrayUtil.isNotEmpty(objects)) { sb.append(", Parameter value - ").append(Arrays.toString(objects)); } throw new ServiceException(sb.toString()); }; } }