zoukankan      html  css  js  c++  java
  • 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...
        }
    }
    
  • 相关阅读:
    Exchanger, Changing data between concurrent tasks
    Java Concurrency
    Linux禁止ping以及开启ping的方法
    Linux内存使用消耗高
    Linux主机系统目录误操作权限修改为777修复方法
    linux磁盘空间用满的处理方法
    Linux查看实时带宽流量情况
    网站无法打开通常解决方法
    iptables的conntrack表满了导致访问网站很慢
    影响网站打开速度的因素有哪些
  • 原文地址:https://www.cnblogs.com/liboware/p/13224547.html
Copyright © 2011-2022 走看看