我正在一个看起来像这样的Java服务层进行调用;
Future<Object> future = Patterns.ask(myActor, message, timeout);
Response res = (Response) Await.result(future, timeout.duration());
Run Code Online (Sandbox Code Playgroud)
我已经阅读了Akka文档,并且实现了阻止,不建议这样做.我需要将响应对象返回给调用方法.是否可以通过我的Java服务与Akka异步执行此操作?我尝试使用该future.onSuccess方法执行此操作,但该onSuccess方法不允许返回值,因此我无法返回该值.
在线程之间传递数据的 akka 方式,本质上就是你通过上面的阻塞所做的事情,就是编写 futures 或向 Actor 发送消息。
以下示例取自Akka 文档。
final ExecutionContext ec = system.dispatcher();
Future<String> f1 = future(new Callable<String>() {
public String call() {
return "Hello" + "World";
}
}, ec);
Future<Integer> f2 = f1.map(new Mapper<String, Integer>() {
public Integer apply(String s) {
return s.length();
}
}, ec);
f2.onSuccess(new PrintResult<Integer>(), system.dispatcher());
Run Code Online (Sandbox Code Playgroud)
请注意,在此示例中,数据被“返回”,或者更准确地说,数据被移交给另一个工作单元,而线程不必阻塞并等待结果。
这就是为什么 onSuccess 返回 void 的原因,它要在组合 future 链的末尾使用。如果它要返回一个值,它就像map一样,它会返回另一个Future。这将使您面临相同的阻止要求。
因此回答你的问题,不。没有办法在不阻塞的情况下从异步未来“返回”值。相反,您应该检查为什么需要像这样返回 Response,并查看是否可以将 Response 的处理移至 onSuccess 或 map 中。一个较小的替代方案是返回 Future[Response] 并让调用者担心链接 future。您遇到的情况通常发生在混合范例时,最好避免这种情况。