我不知道应该如何以非阻塞方式解决此方案。
考虑两个因素Actor1
和Actor2
在Actor1
范围内
Map<Int, Int> foo() {
List<String> finalList = foo_2();
Map<Int, Int> finalMap = // do stuff with finalList to get Map<Int, Int>;
return finalMap;
}
List<String> foo_2() {
CompletableFuture<List<String>> Querylist = ask(Actor2)
Querylist.get();
return QueryList;
}
目前在foo_2中,Querylist.get()
是一个阻塞调用。我想以某种非阻塞的方式解决这个问题。我在Actor1
中为Actor2
创建了一个消息适配器,这样Actor2
发送的任何消息都将由Actor1
处理。
我使用以下方法修改阻塞调用
Map<Int, Int> foo() {
CompletionStage<List<String>> finalList = foo_2();
finalList.whenComplete(
// what to do here?
)
// Map<Int, Int> finalMap = // do stuff with finalList to get Map<Int, Int>;
return finalMap;
}
CompletionStage<List<String>> foo_2() {
CompletionStage<List<String>> Querylist = ask(Actor2)
return QueryList;
}
我不确定如何正确地使用CompletionStage构造来获得与使用阻塞futures.get()调用获得的结果相同的结果。
2条答案
按热度按时间gr8qqesn1#
如果您使用Akka Typed(从标记中暗示),则根本不需要future或消息适配器,只需使用
ActorContext.ask
即可。有关两个参与者之间使用ask的请求-响应,请参见文档。
从广义上讲,您可以去掉
foo
和foo_2
方法,将设置好的消息适配器移到ActorContext.ask
调用中,并将以前调用foo
的示例替换为对ActorContext.ask
的调用。那么一种好的做法是将所需的状态部分嵌入到适配器生成的消息中。uemypmqf2#
您可以使用
pipeToSelf
(请参阅https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#send-future-result-to-self),将询问的结果传送给参与者本身。foo()的结果可以传送给参与者本身,就像行程任何其他消息一样。最好为此建立特定的消息类型。您还应该了解一下
CompletionStage
方法,最重要的是thenApply
(https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html#thenApply-java.util.function.Function-),它可以转换结果,例如从finalList
创建Map
,从Map
创建MapMessage
。然后,您可以像处理执行元中的任何其他消息一样处理MapMessage
。