возможно ли запустить все запросы параллельно и объединить их в одной точке.
Это именно то, что ваш код уже делает. Если вы мне не верите, наберите .delayElement(Duration.ofSeconds(2))
после вашего bodyToMono()
звонка. Вы увидите, что ваш список распечатывается через 2 секунды, а не через 20 (что было бы при последовательном выполнении 10 раз).
Часть , объединяющая , происходит вВаш Flux.merge().collectList()
вызов.
В этом случае «Готово» печатается до фактического ответа.
Этого следует ожидать, так как ваш последний вызов System.out.println()
выполнение вне цепочки реактивного обратного вызова. Если вы хотите, чтобы «Готово» печаталось после того, как распечатан ваш список (который вы вводили в заблуждение, указав имя переменной s
в получателе, переданном вашему вызову subscribe()
), вам нужно поместить его в этого получателя, а неза ее пределами.
Если вы взаимодействуете с императивным API, и поэтому вам необходимо заблокировать список , вы можете просто сделать:
List<String> list = Flux.merge(responseOne).collectList().block();
... который будет по-прежнему выполнять вызовы параллельно (поэтому все равно получит некоторое преимущество), но затем будет блокироваться, пока все они не будут завершены и объединены в список. (Если вы используете только реактор для этого вида использования, однако, это спорно, если это стоит.)