如何在Java中异步使用Akka Futures

时间:2014-08-20 15:09:16

标签: java akka

我正在一个看起来像这样的Java服务层进行调用;

Future<Object> future = Patterns.ask(myActor, message, timeout);

Response res = (Response) Await.result(future, timeout.duration());

我已经阅读过Akka文档,并且不建议像这样实现阻止。我需要将响应对象返回给调用方法。是否可以通过我的Java服务与Akka异步执行此操作?我尝试使用future.onSuccess方法执行此操作,但onSuccess方法不允许返回值,因此我无法返回值。

1 个答案:

答案 0 :(得分:4)

在线程之间传递数据的akka​​方式,这实际上是你通过阻止上面所做的就是组成期货或向Actor发送消息。

以下示例取自Akka documentation

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());

请注意,在此示例中,数据正在被“返回”,或者更确切地说,它被移交给另一个工作单元而没有线程必须阻塞并等待结果。

这就是onSuccess返回void的原因,它将在组合期货链的末尾使用。如果要返回一个值,那就像map一样,它会返回另一个Future。哪会让你有同样的阻止要求。

因此,回答你的问题,没有。没有阻塞就无法从异步未来“返回”一个值。相反,您应该查看为什么需要像这样返回响应,并查看是否可以将响应的处理移动到onSuccess或map。一个小的替代方案是返回Future [Response]并让调用者担心链接未来。你遇到的情况通常发生在混合范例时,最好避免使用。