• 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...
        }
    }
    
  • 相关阅读:
    Java之序列化和反序列化
    Java之流的分类
    Java之扫描目录,修改文件内容
    Java之数据流-复制二进制文件
    Java之字符流操作-复制文件
    Java之字节流操作-复制文件
    SQL语句优化原则
    php程序效率优化的一些策略小结
    MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?
    笔记:php有那几种错误提示和查错方法
  • 原文地址:https://www.cnblogs.com/liboware/p/13224547.html
Copyright © 2020-2023  润新知