Application启动类添加注解:@EnableAsync
注解启用了 Spring 异步方法执行功能
详见: Spring Framework API
package com.xx.xxxx;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@MapperScan({"com.xx.*.mapper"})
@EnableAsync
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication .class, args);
}
}
在方法上添加注解:@Async
在Spring中,基于@Async标注的方法,称之为异步方法;
这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作;
方法返回值定义需使用Future接口做封装
方法返回值返回需实现AsyncResult类做封装
@Override
@Async
public Future<String> testMethod(Integer recordId) {
//业务代码实现
return new AsyncResult<>("返回结果");
}
Future接口:
- 当异步执行结束之后,返回的结果将会保存在Future中。
- 执行一个长时间运行的任务时,使用Future可以让我们暂时去处理其他的任务,等长任务执行完毕再返回其结果。
- 经常会使用到Future的场景有:1. 计算密集场景。2. 处理大数据量。3. 远程方法调用等。
AsyncResult类:
- 类封装异步委托上的异步操作的结果,与异步委托一起使用
- AsyncResult 具有 AsyncDelegate 属性,该属性保存在其上调用异步调用的委托对象
调用异步方法并获取返回值
必须使用循环来判断方法执行状态来获取返回值
public ResponseModel<Object> sendServiceNotification(Integer recordId){
Future<String> res = xxxService.testMethod(1);
try{ //循环获取异步任务执行是否结束,结束则获取返回值返回
while(true){
if (res.isDone()) {
return ResponseModel.success(res.get());
}
//居民数多,推送时间较久,可放缓循环时间,但线程休眠会导致请求超时
//Thread.sleep(1000);
}
}catch (InterruptedException e) {
e.printStackTrace();
}catch (ExecutionException e) {
e.printStackTrace();
}
return ResponseModel.success("内容已推送!");
}