Estoy llamando a un método de cliente asíncrono transmitiendo una lista de objetos. El método devuelve Future.
¿Cuál es la mejor manera de iterar sobre la lista de futuros devueltos después de la llamada (para procesar los futuros que vienen primero)?
Nota: El cliente asíncrono solo devuelve Futuro, no CompletableFuture.
El siguiente es el código:
List<Future<Object>> listOfFuture = objectsToProcess.parallelStream() .map((object) -> { /* calling an async client returning a Future<Object> */ }) .collect(Collectors.toList());Teniendo esta lista de List<Future<Object>> , la enviaría a un grupo personalizado, en lugar de usar el procesamiento paralelo de flujo predeterminado.
Esto se debe a que la API de transmisión usa un grupo común para el procesamiento paralelo y llamará get esos futuros (si el procesamiento lleva mucho tiempo); bloqueará todas las demás operaciones de transmisión que usan operaciones paralelas dentro de su aplicación hasta que finalice esta. .
Esto sería un poco como esto:
forJoinPool.submit( () -> list.stream().parallel().map(future -> future.get()).collect(Collectors.toList())).get();Iría con un grupo personalizado como el que se muestraaquí