译者:littlebrain4solving概要说明在此篇文章中,我们根据使用@Async注解进行探索Spring对异步执行的支持 。
来源:
https://blog.csdn.net/littlebrain4solving/
简单的把@Async注解放到Bean的方法上就会使用不同的线程运行,也就是说,调用者执行此方法不用一直等待整个方法执行完毕 。
在Spring中比较有趣的一点就是事件机制也支持异步处理,如果你想这样使用的话 。
配置并开启@Async扫描支持让我们开始使用JAVA的注解配置开启异步处理机制,只需要简单的加上@EnableAsync注解到配置类上即可 。
@Configuration@EnableAsyncpublic class SpringAsyncConfig { ... }
通过加上简单的注解基本就满足需要了,但如果你有其它需要,依然也有几种简单选项供你设置:- annotation:默认情况下, @EnableAsync 会扫描使用了Spring @Async与EJB 3.1 javax.ejb.Asynchronous的方法;此选项也可以用来扫描其他的,如用户自定义的注解类型;
- mode:指定应该使用哪种AOP进行切面处理 - JAVA代理或AspectJ;
- proxyTargetClass:指定应该使用哪种代理类 - CGLIB或JDK;此属性只有当mode设置成AdviceMode.PROXY才会产生效果 。
- order:设置AsyncAnnotationBeanPostProcessor执行顺序(生命周期有关);默认情况下会最后一个执行,所以这样就能顾及到所有已存在的代理 。
<task:executor id="myexecutor" pool-size="5" /><task:annotation-driven executor="myexecutor"/>
关于@Async注解首先 - 让我们来了解一些规则 - @Async有两点局限性(无法正常工作) 。- 方法名必须是public进行修饰的
- 必须不能在同一个类中调用异步方法
方法无返回值下例就是一个简单的无返回值的异步运行方法:
@Asyncpublic void asyncMethodWithVoidReturnType() { System.out.println("Execute method asynchronously. " + Thread.currentThread().getName());}
方法有返回值@Async 注解的方法也可以指定返回类型:只需在Future的泛型中指定所需要返回的类型即可 。文章插图
Spring 同样也提供了一个Future的实现类叫AsyncResult,此类可以用来跟踪异步方法调用结果 。
现在,让我们来调用上面的方法并通过Future进行获取到异步处理的结果 。
文章插图
关于Executor默认情况下,Spring使用SimpleAsyncTaskExecutor来运行这些异步方法,默认的设置方式可以在两个层级上面进行覆盖 - 在应用全局配置上或在单独的方法上 。
单独的方法上覆盖Executor在配置类中配置所需的executor:
文章插图
应用全局配置上覆盖Executor配置类应该实现AsyncConfigurer接口 - 意思是getAsyncExecutor方法需要我们自己来进行实现,会返回Executor给整个应用实例使用 - 意味着现在充当默认的Executor去运行加了@Async注解的方法 。
文章插图
异常处理由于返回值类型是Future,异常处理就简单了 - Future.get()会抛出异常 。
但是,如果返回类型是void,异常将无法正常传送到调用的线程. 因此,我们需要添加一些额外的配置来处理异常 。
我们创建一个实现了
AsyncUncaughtExceptionHandler接口的自定义异步异常处理类.一旦任意未捕获的异常产生后都会调用handleUncaughtException()方法 。
文章插图
在上一个代码段中,我们看到配置类实现了AsyncConfigurer接口.根据其中的部分,我们同样也需要实现
getAsyncUncaughtExceptionHandler()方法来自定义我们的异步异常处理类:
@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return new CustomAsyncExceptionHandler();}
结论在本章中,我们看到利用Spring运行一个异步任务只需要配置一些很简单的内容就可以达到效果了,但我们同样也看到更多高级的配置用法,如:自定义Executor或自定义异常处理策略 。
推荐阅读
- 山是如何形成的? 地球上的高山是怎样形成的
- 人物设定|如何扭转领导的区别对待?这3点是疏通关键,做好了职场顺风顺水
- 职业规划|建筑工程业从业者,如何预防中年危机?需要做职业规划吗?
- 普洱茶如何挑选,如何挑选龙井茶叶
- “冬季病”来袭 准妈妈该如何预防
- 冬季咽喉炎危害大 如何巧妙预防咽炎
- 冬季干燥要如何缓解 要做到内外兼顾
- 冬季要如何预防心血管疾病 坚持锻炼是根本
- 泡茶水温该如何掌握,如何泡出龙井茶的宜人香韵
- 寒冷冬季如何让孩子少生病 专家:少带孩子去密集之地