我正在一个看起来像这样的Java服务层进行调用;
Future<Object> future = Patterns.ask(myActor, message, timeout);
Response res = (Response) Await.result(future, timeout.duration());
我已经阅读过Akka文档,并且不建议像这样实现阻止。我需要将响应对象返回给调用方法。是否可以通过我的Java服务与Akka异步执行此操作?我尝试使用future.onSuccess
方法执行此操作,但onSuccess
方法不允许返回值,因此我无法返回值。
答案 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]并让调用者担心链接未来。你遇到的情况通常发生在混合范例时,最好避免使用。