0

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

这是我的实现。需要改进它的建议。没有 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。

4

1 回答 1

0

在这种情况下,我会避免使用 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");
    }
于 2022-02-14T07:55:43.020 回答