如何在调用 5 次后合并 webClient 调用的响应并将完整的响应保存在数据库中

how to merge the response of webClient call after calling 5 times and save the complete response in DB

我有这样的场景: 如果条目在数据库中可用,我必须检查 table 然后如果可用,我需要使用 webclient 调用相同的外部 api n 次,收集所有响应并将它们保存在数据库中。如果条目在数据库中不可用,则调用旧流程。

这是我的实现。需要改进它的建议。没有 for-each

public Mono<List<ResponseObject>> getdata(String id, Req obj) {
    return isEntryInDB(id) //checking the entry in DB
        .flatMap(
            x -> {
              final List<Mono<ResponseObject>> responseList = new ArrayList<>();
              IntStream.range(0, obj.getQuantity()) // quantity decides how many times api call t happen
                  .forEach(
                      i -> {
                        Mono<ResponseObject> responseMono =
                            webClientCall(
                                    id,
                                    req.getType())
                                .map(
                                  res ->
                                        MapperForMappingDataToDesriedFormat(res));
                        responseList.add(responseMono);
                      });
              return saveToDb(responseList);
            })
        .switchIfEmpty(oldFlow(id, req));  //if DB entry is not there take this existing flow.

需要一些建议来改进它而不使用 foreach。

在这种情况下,我会避免使用 IntStream,而是使用本地运算符来反应器称为 Flux。

您可以将 InsStream.range 替换为 Flux.range。像这样:

return isEntryPresent("123")
                .flatMapMany(s -> Flux.range(0, obj.getQuantity())
                        .flatMap(this::callApi))
                .collectList()
                .flatMap(this::saveToDb)
                .switchIfEmpty(Mono.defer(() ->oldFlow(id, req)));

    private Mono<Object> saveToDb(List<String> stringList){
        return Mono.just("done");
    }
    private Mono<String> callApi(int id) {
        return Mono.just("iterating" + id);
    }

    private Mono<String> isEntryPresent(String id) {
        return Mono.just("string");
    }