content: package org.ruoyi.common.core.config;
  
  import cn.hutool.core.util.ArrayUtil;
  import org.ruoyi.common.core.exception.ServiceException;
  import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.beans.factory.annotation.Qualifier;
  import org.springframework.boot.autoconfigure.AutoConfiguration;
  import org.springframework.scheduling.annotation.AsyncConfigurer;
  import org.springframework.scheduling.annotation.EnableAsync;
  
  import java.util.Arrays;
  import java.util.concurrent.Executor;
  import java.util.concurrent.ScheduledExecutorService;
  
  /**
   * 异步配置
   *
   * @author Lion Li
   */
  @EnableAsync(proxyTargetClass = true)
  @AutoConfiguration
  public class AsyncConfig implements AsyncConfigurer {
  
      @Autowired
      @Qualifier("scheduledExecutorService")
      private ScheduledExecutorService scheduledExecutorService;
  
      /**
       * 自定义 @Async 注解使用系统线程池
       */
      @Override
      public Executor getAsyncExecutor() {
          return 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());
          };
      }
  
  }
  