学科分类
目录
Spring Boot开发

有返回值异步任务调用

在实际开发中,项目中可能会涉及到有返回值的异步任务调用。例如,一个程序中需要调用两个业务方法对相关业务数据统计分析,并将统计结果汇总。下面,使用Spring Boot框架演示这种场景需求,进一步说明有返回值的异步任务调用。

(1)编写异步调用方法

在之前创建的MyAsyncService异步任务业务处理类中,添加两个模拟有返回值的异步任务业务处理方法,示例代码如下。

@Async
public Future<Integer> processA() throws Exception {
    System.out.println("开始分析并统计业务A数据...");
    Long startTime = System.currentTimeMillis();
    Thread.sleep(4000);
    // 模拟定义一个假的统计结果
    int count=123456;
    Long endTime = System.currentTimeMillis();
    System.out.println("业务A数据统计耗时:" + (endTime - startTime));
    return new AsyncResult<Integer>(count);
}
@Async
public Future<Integer> processB() throws Exception {
    System.out.println("开始分析并统计业务B数据...");
    Long startTime = System.currentTimeMillis();
    Thread.sleep(5000);
    // 模拟定义一个假的统计结果
    int count=654321;
    Long endTime = System.currentTimeMillis();
    System.out.println("业务B数据统计耗时:" + (endTime - startTime));
    return new AsyncResult<Integer>(count);
}

上述代码中,在MyAsyncService异步任务业务处理类中添加了两个分别处理业务A数据统计的方法processA()和业务B数据统计的方法processB(),在方法上方都使用了@Async注解标记为异步方法。另外,上述两个异步方法都会有一定的处理时间,并且需要返回统计结果,示例中使用了new AsyncResult<Integer>(count)封装返回的异步结果数据,并将返回值设为Future<Integer>类型。

(2)编写控制层业务调用方法

在之前创建的MyAsyncController异步任务业务处理类中,编写业务数据分析统计的请求处理方法,示例代码如下。

@GetMapping("/statistics")
public String statistics() throws Exception {
    Long startTime = System.currentTimeMillis();
    Future<Integer> futureA = myService.processA();
    Future<Integer> futureB = myService.processB();
    int total = futureA.get() + futureB.get();
    System.out.println("异步任务数据统计汇总结果: "+total);
    Long endTime = System.currentTimeMillis();
    System.out.println("主流程耗时: "+(endTime-startTime));
    return "success";
}

上述代码中,statistics()方法处理映射路径为“/statistics”的业务数据统计的请求,调用和打印了业务层的两个异步方法,并打印了主流程耗时。

(3)异步任务效果测试

启动chapter09项目,项目启动成功后,在浏览器上访问“http://localhost:8080/statistics”测试异步任务请求,会发现浏览器上响应“success”信息需要一段时间,此时查看控制台输出效果,如图1所示。

图1 异步任务调用效果

从演示结果可以看出,执行statistics()方法并调用异步方法处理业务数据统计时,需要耗费一定的时间(5001毫秒)完成主流程的执行,并向页面响应结果,而在主流程打印输出结果之前一直等待着业务A和业务B两个异步方法的异步调用处理和结果汇总。因此,从执行结果可以发现,案例中有返回值的异步任务调用成功。

需要说明的是,上述异步方法是有返回值的,这样主流程在执行异步方法时会有短暂阻塞,需要等待并获取异步方法的返回结果,而调用的两个异步方法会作为两个子线程并行执行,直到异步方法执行完成并返回结果,这样主流程会在最后一个异步方法返回结果后跳出阻塞状态。

点击此处
隐藏目录