spring@async的异常处理

     2022-03-25     357

关键词:

楼主在前面的2篇文章中,分别介绍了Java子线程中通用的异常处理,以及Spring web应用中的异常处理。链接如下:

Java子线程中的异常处理(通用)

Spring web引用中的异常处理

今天,要写的是被Spring @Async注解的方法中的异常处理方法。

 

通常,如果我们要在程序中做一个耗时的操作(例如调用其他外部模块),一般会通过异步的方式执行。

有这2种方法:

  • 自行生成线程池ThreadPoolExecutor,提交任务执行
  • 更方便地,使用Spring @Async注解,修饰在需要异步执行的方法上

对于第一种方法的异常处理,楼主已经在“Java子线程中的异常处理(通用)”这篇文章中介绍了,也就是提交任务后获取到Future对象,通过future.get()获取返回值的时候能够捕获到ExcecutionException。

对于Spring @Async注解的方法,如何进行异常处理呢?楼主想到了2种方法。

解决办法

方法一:配置AsyncUncaughtExceptionHandler(对于无返回值的方法)

通过AsyncConfigurer自定义线程池,以及异常处理。

 1 @Configuration
 2 @EnableAsync
 3 public class SpringAsyncConfiguration implements AsyncConfigurer {
 4     private static final Logger logger = LoggerFactory.getLogger(getClass());
5 @Bean 6 @Override 7 public Executor getAsyncExecutor() { 8 ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 9 executor.setCorePoolSize(8); 10 executor.setMaxPoolSize(16); 11 executor.setQueueCapacity(64); 12 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); 13 executor.setThreadNamePrefix("SpringAsyncThread-"); 14 15 return executor; 16 } 17 18 @Override 19 public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 20 return new SpringAsyncExceptionHandler(); 21 } 22 23 class SpringAsyncExceptionHandler implements AsyncUncaughtExceptionHandler { 24 @Override 25 public void handleUncaughtException(Throwable throwable, Method method, Object... obj) { 26 logger.error("Exception occurs in async method", throwable.getMessage()); 27 } 28 } 29 30 }

方法二:通过AsyncResult捕获异常(对于有返回值的方法)

如果异步方法有返回值,那就应当返回AsyncResult类的对象,以便在调用处捕获异常。

因为AsyncResult是Future接口的子类,所以也可以通过future.get()获取返回值的时候捕获ExcecutionException。

异步方法:

@Service
public class AsyncService {

    @Async
    public AsyncResult<String> asyncMethodWithResult() {
        // do something(可能发生异常)

        return new AsyncResult("hello");
    }

}

调用处捕获异常:

 1 public class Test {
 2 
 3     private Logger logger = LoggerFactory.getLogger(getClass());
 4 
 5     @Autowired
 6     AsyncService asyncService;
 7 
 8     public void test() {
 9         try {
10             Future future = asyncService.asyncMethodWithResult();
11             future.get();
12         } catch (ExecutionException e) {
13             logger.error("exception occurs", e);
14         } catch (InterruptedException e) {
15             logger.error("exception occurs", e);
16         }
17     }
18 
19 }

 

Spring @Async 与 Future

】Spring@Async与Future【英文标题】:Spring@AsyncwithFuture【发布时间】:2013-04-3014:07:32【问题描述】:我是java.util.concurrent.Future的新手,有一些问题。如果我使用Future调用服务,我如何知道调用该服务的元素是什么?这是一个例子:... 查看详情

Spring @Async 与 Spring WebFlux

】Spring@Async与SpringWebFlux【英文标题】:Spring@AsyncvsSpringWebFlux【发布时间】:2021-02-1916:21:41【问题描述】:我正在尝试使用WebFlux转换以下方法以避免在同一方法上使用@Async。@Async@OverridepublicvoidnotifyCallback(NotifyCallbackRequestrequest,Stri... 查看详情

spring@async

引入@SpringBootApplication@EnableAsyncpublicclassProjectApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ProjectApplication.class,args);}}使用@Slf4jpublicclassTestService{@Async@Transa 查看详情

spring@async线程默认配置

 @Async异步方法默认使用Spring创建ThreadPoolTaskExecutor配置类是TaskExecutionProperties【org.springframework.boot.autoconfigure.task.TaskExecutionProperties】 默认核心线程数:8最大线程数:Integet.MAX_VALUE队列使用LinkedBlocki 查看详情

何时使用 Spring @Async vs Callable 控制器(异步控制器,servlet 3)

】何时使用Spring@AsyncvsCallable控制器(异步控制器,servlet3)【英文标题】:WhentouseSpring@AsyncvsCallablecontroller(asynccontroller,servlet3)【发布时间】:2013-06-1413:23:30【问题描述】:我想知道使用Callable在Spring中使用@Async和Servlet3异步请求... 查看详情

Spring @async 子线程上下文多租户

】Spring@async子线程上下文多租户【英文标题】:Spring@asyncchildthreadcontextmultitenancy【发布时间】:2018-06-2602:42:34【问题描述】:我有一个应用程序,它向我的java应用程序发送一些REST调用。我必须在@Async模式下运行最后一个命令,... 查看详情

异步任务spring@async注解源码解析

目录1.引子2.源码解析[email protected]2.2@EnableAsync2.3.AOP-Advisor切面初始化:(AsyncAnnotationBeanPostProcessor-》setBeanFactory())2.4.AOP-生成代理类AopProxy(AsyncAnnotationBeanPostProcessor-》postProcessAfterInitia 查看详情

ruby异常处理的基础

异常处理的优点:程序不需要逐个确认处理结果,也能自动检查出程序错误会同时报告发送错误的位置,便于排查错误正常处理与错误处理的程序可以分开书写,使程序便于阅读异常处理的语法:如果异常处理的范围是整个方法... 查看详情

异常处理

1,为什么需要异常处理?异常是导致程序中断执行的一种指令流。如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失,所以在程序的设计中必须要考虑各种异常的发生,并正确的做好相应的处理,... 查看详情

异常的捕获及处理

作者:gqk:  1、异常的产生原因及处理格式  2、异常的标准使用方式  3、throw和throws关键字的作用认识异常:保证程序不会因出现异常而终止,必须对有可能出现异常的代码进行处理 现实生活中的异常:  处理异... 查看详情

java异常处理(父子异常的处理)

  我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那个时候还不知道子类方法为... 查看详情

异常处理(代码片段)

异常处理一、什么是异常处理异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止二、异常的内容(1)traceback异常的追踪信息(2)异常的类型(... 查看详情

异常处理

 异常处理  概念  java异常是处理程序中错误的一种机制,错误通常指的是程序在运行的过程中发生的一些异常事件,比如0作为除输,数组下标越界,流读取的文件不存在。  设计程序的时候应该在异常发生时能友好... 查看详情

java异常处理

程序的实际运行的过程中经常会遇到异常情况的发生,导致正常流程的改变,造成恶劣的后果。为了减少损失,应该事先充分预计所有可能出现的异常,然后采取对应的措施。java异常处理机制传统的编程语并没有异常处理机制... 查看详情

java中的异常处理

  计算机语言程序开发中异常几乎是人人都会出现的问题,可以这么说:没有没有异常的程序!所以,计算机语言中异常处理是十分重要的一块,纠错能力也是每个程序员必须具备的基本能力!  异常处理的三种处理方式:... 查看详情

c++中的异常处理

 来自:CSDN卡尔 后续有C++中的异常处理(二)和C++中的异常处理(三),C++中的异常处理(二)是对动态分配内存后内部发生错误情况的处理方法,C++中的异常处理(三)中是使用时的异常说明。都易懂易学,值得读!... 查看详情

异常处理(代码片段)

异常处理什么叫做异常?异常定义:程序执行过程中出现问题导致程序无法执行异常的分类:1)程序遇到逻辑或算法错误2)运行过程中计算机错误:内存不够或者io错误异常的步骤:1异常产生,检查到错误且解释器认为是异常,抛出异常2异... 查看详情

异常处理

异常:运行代码中遇到的任何错误,带有error字样的都是异常异常处理:对代码中所有可能出现的异常进行处理捕获具体的异常:扩大捕获范围:只要有异常就捕获:记录异常信息:try..except..else 查看详情