关键词:
楼主在前面的2篇文章中,分别介绍了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 查看详情