业务场景:
调用耗费时间很长的接口,由于这些类型的接口阻塞时间太久,前端页面会一直卡在这个接口,做不了其他请求。所以需要将接口设计成异步请求方式。同步、异步的概念就不一~细说了。
实现方式
Step1. AppllicationContext.xml配置文件修改,使项目Async功能生效。
<!--命名空间加入如下配置-->
<beans xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd">
<!--加入如下配置-->
<task:executor id="myexecutor" pool-size="5" />
<task:annotation-driven executor="myexecutor"/>
Step2. 代码中使用@Async注解
//将需要执行的异步方法,封装到一个方法里面,放入一个单独的class中。
/**
* Created with IntelliJ IDEA.
* 异步执行预处理
* @date 2017-11-21 17:37
*/
@Component
public class DataAysncPreHandleAction {
@Autowired
DataPreHandleService dataPreHandleService;
/**
* 异步执行西医预处理
* @param cqMsgVo
*/
@Async
public void doAsyncPreHandleXY(CQMsgVo cqMsgVo) {
/**
* step1,第一步需要执行的业务
*/
public void step1(){};
/**
* step2第二步需要执行的业务
*/
public void step2(){};
/**
* step3第三步需要执行的业务
*/
public void step3(){};
}
}
这样就生成了一个异步方法,其他地方只要调用这个异步方法,当代码执行到此异步方法时,就会开启一个独立线程去执行,主线程则继续往下执行,不会阻塞主线程。
(注: @Async所修饰的函数不要定义为static类型,这样异步调用不会生效)
待深究…
- 本文适用于只需要执行异步方法(通常是耗时操作),并不需要在异步方法执行结束后通知主线程,在后端程序开发中,经常会碰到此场景。
- 移动端、前端开发中的异步方法,通常在子线程的异步方法执行完成后需要通知主线程,(下载,加载大图片)等都是耗时操作,可以设计成异步Aysnc。