akka 使用来自当前执行元进程中的执行元的响应

iqjalb3h  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(153)

我不知道应该如何以非阻塞方式解决此方案。
考虑两个因素Actor1Actor2
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()调用获得的结果相同的结果。

gr8qqesn

gr8qqesn1#

如果您使用Akka Typed(从标记中暗示),则根本不需要future或消息适配器,只需使用ActorContext.ask即可。
有关两个参与者之间使用ask的请求-响应,请参见文档。
从广义上讲,您可以去掉foofoo_2方法,将设置好的消息适配器移到ActorContext.ask调用中,并将以前调用foo的示例替换为对ActorContext.ask的调用。那么一种好的做法是将所需的状态部分嵌入到适配器生成的消息中。

uemypmqf

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

相关问题