场景:比如有两个类:A,B,A类调用B类的异步方法asyncMethod,并获取B类该异步方法返回的结果XxDto。
为什么会有这种场景需求:可能A、B类的业务需要花费的时间较长,为了节约时间故有该设计。如:B类中需要执行大量业务逻辑,或者调用三方接口,如果不采用异步,那么A等待B完成业务后再继续执行A剩下的业务,花费的时间会长;那如果采用了异步,A类又需要获取B类异步方法的返回结果,因此有该设计。在A异步调用B方法时,继续执行A的业务逻辑,接着再去拿B的结果去处理即可。
A类代码如下:
import org.springframework.beans.factory.annotation.Autowired;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@Component
public class A {
@Autowired
private B b;
public void aMethod() throws ExecutionException, InterruptedException {
// 调用B类的异步方法
Future<XxDto> xxDtoFuture = b.asyncMethod();
// 执行A类的业务代码
// 拿出异步方法的返回值,并根据业务作对应处理
XxDto xxDto = xxDtoFuture.get();
}
}
B类代码如下:
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;
import java.util.concurrent.Future;
@Component
public class B {
@Async
public Future<XxDto> asyncMethod() {
// 执行业务代码
// 返回异步结果
return AsyncResult.forValue(new XxDto());
}
}
XxDto代码如下:
import lombok.Data;
@Data
public class XxDto {
}
核心就是在B类异步方法中使用 AsyncResult.forValue(new XxDto()) 来返回一个 Future<XxDto> 的对象,A类调用B的异步方法会有一个 Future<XxDto> 对象的返回值,在调用该对象的get()方法获取到数据。如果A类调用 Future<XxDto> 对象的 get() 方法时,此时B类还没有完成业务,那么就会A类就会阻塞等待B类返回结果后才会执行 get() 方法后的代码。