• SpringBoot-技术专区-自定义TaskExecutor线程池


    1.自定义TaskExecutor

          (1)要想执行异步任务,还需要线程池,默认情况下Spring会在 ioc容器 中找唯一的org.springframework.core.task.TaskExecutor,或者一个 bean

    name 为"taskExecutor" 的java.util.concurrent.Executor 作为执行任务的线程池。

          (2) 如果都没有的话,会创建 SimpleAsyncTaskExecutor 来处理异步方法调用.

           此外如果 void 返回值的异步方法执行中出了异常,异常不会传播到调用线程,默认情况下由SimpleAsyncUncaughtExceptionHandler 来处理,

    只是简单的纪录了日志。

          实现 AsyncConfigurer 来自定义 Executor 和异常处理:

     
    /**
     * @author mafei007
     * @date 2020/3/24 21:30
     */
    @Configuration
    @EnableAsync
    public class AppConfig implements AsyncConfigurer {
    
        @Override
        public Executor getAsyncExecutor() {
             ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
             executor.setCorePoolSize(7);
             executor.setMaxPoolSize(42);
             executor.setQueueCapacity(11);
             executor.setThreadNamePrefix("MyExecutor-");
             executor.initialize();
             return executor;
        }
    
        @Override
        public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
            return new CustomAsyncExceptionHandler();
        }
    
        /**
         * 处理异步方法中未捕获的异常
         */
        class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
    
            @Override
            public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
                System.out.println("Exception message - " + throwable.getMessage());
                System.out.println("Method name - " + method.getName());
                System.out.println("Parameter values - " + Arrays.toString(obj));
                // do something...
                sendMailToAdmin(throwable.getMessage());
            }
    
        }
    
    }
     
    

    其它

         @Async注解支持一个String参数,来指定一个bean name,类型是 Executor 或 TaskExecutor ,表示使用 ioc 容器中指定的线程池来执行这个异步任。

      

    public class Task {
        @Async("Executor-001")
        public void task1(Long id) {
            // do something...
        }
    }
    
  • 相关阅读:
    哇,博客开通啦
    前端与后端数据交互的方式之ajax
    apply()方法和call()方法
    元素居中的方法
    JS中兼容问题的汇总
    关于元素尺寸问题的汇总
    小案例之随机点名系统
    圣杯布局与双飞翼布局
    js自动分页加载所有数据
    浏览器工作流程
  • 原文地址:https://www.cnblogs.com/liboware/p/13224547.html
Copyright © 2020-2023  润新知