CompletableFuture.anyOf() - łączenie wyników

0

Cześć,

Mam problem z CompletableFuture. Metody są uproszczone dla jasności kodu. Mam następującą operacje, która powiedzmy wyszukuje użytkowników:

CompletableFuture<List<String>> findUsers();

Teraz na podstawie tego CompletableFuture chciałbym wykonać następującą operację (dla każdego użytkownika). Ta operacja jest bardzo kosztowna czasowo. Może zwrócić tylko booleana, wyjątek jest obsłużony wewnątrz tej metody i zwracany jako "false":

CompletableFuture<Boolean> userIsActive(final String username);

I teraz mam problem. Chciałbym wykonać operację userIsActive() na wszystkich użytkownikach asynchronicznie i pierwszy CompletableFuture, który zwróciłby "true" kończył by działanie pozostałych operacji userIsActive().
Próbowałem z CompletableFuture.anyOf() ale tam albo przy exceptionally zwraca exception albo zwraca pierwszy wykonany (czyli też "false").
Podsumowując chciałbym się dowiedzieć jak najszybciej, czy któryś userIsActive() zwraca "true".

4

CompletableFuture jaki jest każdy widzi.
Najszybciej i po chamsku to każdego CF przerób przez thenApply, i w funkcji (fn) jak dostaniesz odpowiedni rezultat to po prostu ustaw jakiś globalny znacznik (atomicboolean) i daj cancel pozostałym.z listy. W tym miejscu robisz też to co potrzebujesz, mozesz też zrobić complete na jakims nowym (finalnym) CompletableFuture.

Nie wiem jak to zrobić elegancko na CompletableFuture bez pisania dużej ilości kodu.
Jak byś chciał się bawić w ładniej to możesz przejśc na Future z Vavr :
https://static.javadoc.io/io.vavr/vavr/0.9.2/io/vavr/concurrent/Future.html - firstCompletedOf (List zmienić w Stream VAVR i zrobić filter) - ale nie dam głowy, że się uda.

3

Ja bym odpuścił to kanciaste API i wykorzystał RxJave http://reactivex.io/documentation/operators/amb.html

0

Jak zostaniesz przy CompletableFuture (tylko po co xd) to tutaj kilka fajnych utilsów -> https://github.com/spotify/completable-futures

1 użytkowników online, w tym zalogowanych: 0, gości: 1