Jestem w szoku z powodu tego, jak należy rozwiązywać ten scenariusz nieblokujące sposób.
Rozważmy dwóch aktorów Actor1
i Actor2
Wewnątrz 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;
}
Obecnie w granicach foo_2, Querylist.get()
to blokowanie połączenia. Chcę się jakoś rozwiązać ten problem nieblokujące sposób. Założyłem zasilacz wiadomości dla Actor2
wewnątrz Actor1
więc wszelkie wiadomości, które Actor2
wysyłanie będą przetwarzane Actor1
.
Użyłem następujące podejście do zmiany zablokowanego połączenia
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;
}
Nie jestem pewien, jak prawidłowo używać konstrukcję CompletionStage, aby uzyskać ten sam wynik, który otrzymałem podczas wywołania blokady futures.get ().