AsyncConfigurerSupport自定义异步线程池处理异常

 更新时间:2023年06月13日 14:29:43   作者:老鼠AI大米_Java全栈  
这篇文章主要为大家介绍了AsyncConfigurerSupport自定义异步线程池处理异常详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、AsyncConfigurerSupport 简介

spring 中开启异步只要在配置类加上
@EnableAsync 同时在service方法中加上@Async即可,注意service中的方法想要异步调用必须是通过注入调用(spring 代理)。

@Service
public class ServiceA{
   public void testA(){
       testB();
   }
   @Async
   public void testB(){
   }
}

上述方法在调用testA时是同步调用,而非异步调用,方法内部的直接调用是没有经过spring 代理的。

二、自定义异步调用的线程池和异常处理

AsyncConfigurerSupport 只定义了两个方法分别用于自定义异步线程池、异步产生的异常捕获,通过实现此类即可实现自定义的异步线程池。

demo如下:

新建子类 AsyncConfigHandler

@Configuration
@EnableAsync
public class AsyncConfigHandler extends AsyncConfigurerSupport {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(10);
        executor.initialize();
        return executor;
    }
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new MyAsyncUncaughtExceptionHandler();
    }
    @Bean   // /actuator/shutdown
    @Override
    public Executor getAsyncExecutor2() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setTaskDecorator(new SomeTaskDecorator());
        executor.setCorePoolSize(4);
        executor.setMaxPoolSize(8);
        executor.setQueueCapacity(100);
        executor.setAllowCoreThreadTimeOut(false);
        executor.setKeepAliveSeconds(0);
        executor.setThreadNamePrefix("DefaultAsync-");
        executor.setWaitForTasksToCompleteOnShutdown(true); // 다 끝날때까지 대기
        executor.initialize();
        return executor;
    }
    static class SomeTaskDecorator implements TaskDecorator {
        @Override
        public Runnable decorate(Runnable runnable) {
            return () -> {
                try {
                    log.info("Some Task Decorator Start");
                    runnable.run();
                } finally {
                    log.info("Some Task Decorator End");
                }
            };
        }
    }
}
class MyAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler {
    @Override
    public void handleUncaughtException(Throwable ex, Method method, Object... params) {
        System.out.println("class#method: " + method.getDeclaringClass().getName() + "#" + method.getName());
        System.out.println("type        : " + ex.getClass().getName());
        System.out.println("exception   : " + ex.getMessage());
    }
}

编写支持异步调用注解@Async的 DemoService

@Service
public class DemoService {
    @Async
    public void testAsync() throws InterruptedException {
        System.out.println("这里是异步方法");
        TimeUnit.SECONDS.sleep(10);
        int i = 1 / 0;
    }
}

编写测试 controller

@RestController
@RequestMapping(value = "time")
public class DemoController {
    @Autowired
    private DemoService demoService;
    @RequestMapping(value = "getTimeAndAsync")
    public String getTimeAndAsync() throws InterruptedException {
        demoService.testAsync();
        return "异步加载=》" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }
}

新建spring boot应用的步骤省略

访问 http://localhost:8080/time/getTimeAndAsync

浏览器会立即输出

异步加载=》2021-02-20 15:56:16

等待十秒钟后会捕获异常

class#method: com.example.bootdemo.service.DemoService#testAsync
type : java.lang.ArithmeticException
exception : / by zero

同步调用中可以采用 @RestControllerAdvice 和 @ExceptionHandler 注解捕获全局的异常然后进行处理,如果是异步调用则需要实现 AsyncUncaughtExceptionHandler 进行单独的额外处理。

以上就是AsyncConfigurerSupport自定义异步线程池实现的详细内容,更多关于AsyncConfigurerSupport异步线程池的资料请关注脚本之家其它相关文章!

相关文章

  • Java按顺序提取Word内容的方法步骤(文本+数学公式)

    Java按顺序提取Word内容的方法步骤(文本+数学公式)

    本文分享通过Java POI库解析Word试卷内容,将数学公式转换为LaTeX并保持原有顺序的方法,涉及XML文本提取、节点替换及文档重构,解决公式位置错乱问题,实现非结构化到结构化转换,需要的朋友可以参考下
    2025-09-09
  • 关于集合与数组转换实现方法

    关于集合与数组转换实现方法

    这篇文章主要介绍了关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • SpringMvc实现简易计算器功能

    SpringMvc实现简易计算器功能

    这篇文章主要为大家详细介绍了SpringMvc实现简易计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • 深入了解Java中String、Char和Int之间的相互转换

    深入了解Java中String、Char和Int之间的相互转换

    这篇文章主要介绍了深入了解Java中String、Char和Int之间的相互转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • 关于Arrays.sort()使用的注意事项

    关于Arrays.sort()使用的注意事项

    这篇文章主要介绍了关于Arrays.sort()使用的注意事项,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Java基于面向对象实现一个战士小游戏

    Java基于面向对象实现一个战士小游戏

    这篇文章主要为大家详细介绍了Java如何基于面向对象实现一个战士小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下
    2022-07-07
  • idea创建spring boot工程及配置文件(最新推荐)

    idea创建spring boot工程及配置文件(最新推荐)

    本文给大家介绍idea创建spring boot工程及配置文件,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • 线程池之jdk1.8 Executors创建线程池的几种方式

    线程池之jdk1.8 Executors创建线程池的几种方式

    这篇文章主要介绍了线程池之jdk1.8 Executors创建线程池的几种方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java线程安全的计数器简单实现代码示例

    Java线程安全的计数器简单实现代码示例

    这篇文章主要介绍了Java线程安全的计数器简单实现代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java设计模式之java状态模式详解

    Java设计模式之java状态模式详解

    这篇文章主要介绍了Java设计模式之状态模式定义与用法,结合具体实例形式详细分析了Java状态模式的概念、原理、定义及相关操作技巧,需要的朋友可以参考下
    2021-09-09

最新评论