Я новичок в Webflux и пытаюсь выполнить несколько моно с Flux. Но я думаю, что я делаю это неправильно ... это лучший способ выполнить несколько Mono и собрать их в список?

Вот мой код:

    mainService.getAllBranch()
            .flatMapMany(branchesList -> {
                List<Branch> branchesList2 = (List<Branch>) branchesList.getData();
                List<Mono<Transaction>> trxMonoList= new ArrayList<>();

                branchesList2.stream().forEach(branch -> {
                    trxMonoList.add(mainService.getAllTrxByBranchId(branch.branchId));
                });
                return Flux.concat(trxMonoList); // <--- is there any other way than using concat?
            })
            .collectList()
            .flatMap(resultList -> combineAllList());
    interface MainService{
            Mono<RespBody> getAllBranch();
            Mono<RespBody> getAllTrxByBranchId(String branchId); //will return executed url ex: http://trx.com/{branchId}
    }

До сих пор мой код выше, я могу объяснить это так:

  1. Получить все филиалы
  2. перебрать все branchesList2 и добавить его в trxMonoList
  3. return Flux.concat, это где я не уверен, это правильный путь или нет. но это работает
  4. объединить весь список

Я просто запутался, это правильный способ использовать Flux в моем контексте? или есть какой-то лучший способ добиться того, что я пытаюсь сделать?

3
Abudzar Al-Ghiffari 28 Апр 2020 в 21:12

2 ответа

Вам нужно немного изменить свой код, чтобы он стал реактивным.

 mainService.getAllBranch()
        .flatMapMany(branchesList -> Flux.fromIterable(branchesList.getData())) (1)
        .flatMap(branch -> mainService.getAllTrxByBranchId(branch.branchId))    (2)
        .collectList()
        .flatMap(resultList -> combineAllList());

1) Создать Flux веток из List;

2) Переберите каждый элемент и вызовите сервис.

Вы не должны использовать Stream API в Reactor, потому что он имеет те же методы, но с адаптацией и оптимизацией для многопоточности.

0
Yauhen Balykin 28 Апр 2020 в 20:23

Настоящая проблема здесь заключается в том, что вы не должны нажимать Mono несколько раз в пределах Flux. Это даст вам проблемы. Если вы разрабатываете API, вы должны исправить это, чтобы сделать то, что вы хотите, в правильной реактивной манере.

interface MainService{
        Flux<Branch> getAllBranch();
        Flux<Transaction> getAllTrxByBranchId(Flux<String> branchIds);
}

Тогда ваш код станет проще, и реактивная структура будет работать правильно.

mainService.getAllTrxByBranchId(
    mainService.getAllBranch()
    .map(Branch::getId)
);
0
K.Nicholas 28 Апр 2020 в 20:44