前言
前面简单介绍了springboot的异步,以及自定义线程池。这里再和大家一起学习下springboot异步中的结果获取。在实际项目中,我们可能需要获取异步回调的结果,这种结果获取,和同步获取肯定是不一样的。其实异步调用的获取结果也很简单,我们结合Future来实现,下面直接看代码。
保存异步调用结果
我们在异步任务执行完成之后,将结果保存在AsyncResult中,AsyncResult是Future的子类。
/**
* @author 蒋墨风
* @title: FutureTaskTest
* @projectName study
* @description: 异步调用,结果保存
* @date 2019/6/30 14:34
*/
@Async("getThreadPoolExecutor")
@Component
public class FutureTaskTest {
public Future<String> testFutureTask1() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new AsyncResult<>("hello...爱琴孩!");
}
public Future<String> testFutureTask2() {
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new AsyncResult<>("hello...iflytek!");
}
public Future<String> testFutureTask3() {
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new AsyncResult<>("hello...树先生!");
}
}
获取任务执行结果
上面我们将任务执行完的结果保存了,我们就可以取任务执行结果了,代码如下
@RequestMapping("/testFuture")
public void testFuture() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
LOGGER.info("invoke method testFuture startTime :" + sdf.format(new Date()));
Future<String> futureResult1 = futureTaskTest.testFutureTask1();
Future<String> futureResult2 = futureTaskTest.testFutureTask2();
Future<String> futureResult3 = futureTaskTest.testFutureTask3();
try {
while (!futureResult1.isDone()) {
Thread.sleep(1000);
}
while (!futureResult2.isDone()) {
Thread.sleep(1000);
}
while (!futureResult3.isDone()) {
Thread.sleep(1000);
}
String result1 = futureResult1.get();
String result2 = futureResult2.get();
String result3 = futureResult3.get();
LOGGER.info("result1:{},result2:{},result3:{},结束时间:{}",
result1, result2, result3, sdf.format(new Date()));
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
测试结果
从上面的测试结果中,我们可以看到获取到三个异步任务从开始执行到获取到所有结果,共耗时9秒! 在获取结果的时候如果直接get会导致当前线程阻塞。