这回把Spring @Async彻底搞懂了

Posted 程序员内参

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这回把Spring @Async彻底搞懂了相关的知识,希望对你有一定的参考价值。


来自:架构即人生 | 责编:乐乐

链接:toutiao.com/i6717216694709780996


开启异步支持


@Configuration
@EnableAsync
public class SpringAsyncConfig { ... }


默认情况下,@EnableAsync检测Spring的@Async注释和EJB 3.1 javax. EJB .异步;此选项还可用于检测其他用户定义的注释类型。


@Async注解使用


1.无返回值


@Async
public void asyncMethodWithVoidReturnType() {
 System.out.println("Execute method asynchronously. "
 + Thread.currentThread().getName());
}


2.有返回值


@Async
public Future<String> asyncMethodWithReturnType() {
 System.out.println("Execute method asynchronously - "
 + Thread.currentThread().getName());
 try {
 Thread.sleep(5000);
 return new AsyncResult<String>("hello world !!!!");
 } catch (InterruptedException e) {
 //
 }
 
 return null;
}


执行器


默认情况下,Spring 使用SimpleAsyncTaskExecutor去执行这些异步方法(此执行器没有限制线程数)。此默认值可以从两个层级进行覆盖:


  • 方法级别

  • 应用级别


1. 方法级别覆盖


@Async("threadPoolTaskExecutor")
public void asyncMethodWithConfiguredExecutor() {
 System.out.println("Execute method with configured executor - "
 + Thread.currentThread().getName());
}


2. 应用级别覆盖


配置类应该实现AsyncConfigurer接口——这意味着它拥有getAsyncExecutor()方法的实现。在这里,我们将返回整个应用程序的执行器——这现在成为运行带有@Async注释的方法的默认执行器:


@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer {
 
 @Override
 public Executor getAsyncExecutor() {
 ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
 executor.initialize();
 executor.setCorePoolSize(5);
 executor.setMaxPoolSize(10);
 executor.setQueueCapacity(25);
 return executor;
 }
 
}


异常处理


当方法返回值是Future的时候,异常捕获是没问题的 - Future.get()方法会抛出异常。但是,如果返回类型是Void,那么异常在当前线程就捕获不到。


因此,我们需要添加额外的配置来处理异常。

我们将通过实现AsyncUncaughtExceptionHandler接口创建一个定制的async异常处理程序。

handleUncaughtException()方法在存在任何未捕获的异步异常时调用:


public 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());
 for (Object param : obj) {
 System.out.println("Parameter value - " + param);
 }
 }
 
}


在上一节中,我们研究了由configuration类实现的AsyncConfigurer接口。作为其中的一部分,我们还需要覆盖getAsyncUncaughtExceptionHandler()方法来返回我们自定义的异步异常处理程序:


@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
 return new CustomAsyncExceptionHandler();
}

程序员内参
微信号:

programmer0001


推荐理由:
在这里,我们分享程序员相关技术,职场生活,行业热点资讯。不定期还会分享IT趣文和趣图。这里属于我们程序员自己的生活,工作和娱乐空间。
 ▼长按下方↓↓↓二维码识别关注


以上是关于这回把Spring @Async彻底搞懂了的主要内容,如果未能解决你的问题,请参考以下文章

昨天,我彻底搞懂了Netty内存分配策略!

12张手绘图,让我彻底搞懂了微服务架构!

这12张手绘图,让我彻底搞懂了微服务架构!

彻底搞懂行内元素,块级元素,行内块元素

彻底搞懂最短路算法

听说看了这篇文章就彻底搞懂了什么是OPC(上)