Esta pregunta es exactamente la misma que esta , que en realidad no se respondió (ese código solo usa un hilo). Mi código se ve así en este momento
CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> { foo.stream().parallel() .forEach(bar -> { //business logic } ); return null; }, new TraceableExecutorService(this.beanFactory, Executors.newFixedThreadPool(threads), "fooBarStream")); completableFuture.get(); sin embargo, solo un hilo está correctamente trazado. Usar .parallelStream() o un LazyTraceExecutor directamente en lugar de un TraceableExecutorService no ayudó.
Parece funcionar gracias a este ejemplo . El fragmento anterior se convierte en:
TraceableExecutorService executorService = new TraceableExecutorService(this.beanFactory, Executors.newFixedThreadPool(threads), "fooStream"); CompletableFuture.allOf(runnablesBusinessLogic(foo,executorService)).get(); donde está runnablesBusinessLogic
private CompletableFuture<Void>[] runnablesBusinessLogic(List<FooBar> foo, ExecutorService executorService) { List<CompletableFuture<?>> futures = new ArrayList<>(); for (FooBar f : foo) { futures.add(CompletableFuture.runAsync(() -> { businessLogic(f); return; }, executorService)); } return futures.toArray(new CompletableFuture[futures.size()]); } Si entendí el ejemplo (y la discusión detrás del estado actual de la documentación) correctamente, Sleuth no puede trabajar con un ForkJoinPool (y por lo tanto con flujos paralelos) automáticamente. La idea principal para que funcione no es crear un CompletableFuture y dividirlo, sino crear varios futuros (y unirlos).