如何在Java中异步使用Akka Futures

cdu*_*gan 6 java akka

我正在一个看起来像这样的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方法不允许返回值,因此我无法返回该值.

Chr*_*s K 4

在线程之间传递数据的 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。您遇到的情况通常发生在混合范例时,最好避免这种情况。