Как создать последовательность Mono во время выполнения - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь создать последовательность Mono динамически на основе пользовательского ввода.Я звоню по остальным API и получаю ClientResponse в Mono.Мои сценарии использования - вызов двух или более API-интерфейсов в последовательности, а полезная нагрузка следующего API зависит от выходных данных предыдущего API.

Моя жестко запрограммированная последовательность операций выглядит как


    public Mono&ltResponseEntity&gt processSequentially(ServerHttpRequest request, JsonNode reqBody) {
            RequestData reqData = this.prepareReqMetadata(request, reqBody);
            return commonConnector.getApiResponse(reqData)
                    .flatMap(resp -> resp.bodyToMono(JsonNode.class))
                    .flatMap(respBody -> getApiResponse(request, metadataRequestBuilder, respBody))
                    .flatMap(resp -> resp.bodyToMono(JsonNode.class))
                    .flatMap(respBody -> getApiResponse(request, listingRequestBuilder, respBody))
        }

Это работает нормально, но я хочу сделать этот метод универсальным.Я хочу получить все необходимые параметры от пользователя в списке POJO и создать последовательность flatMap на основе ввода списка.Таким образом, если длина List равна 2, будет 2 последовательности flatMap, а если длина равна 3 или более, число flatMap также будет равно 3 или более.

1 Ответ

1 голос
/ 10 июля 2019

Ничего не происходит, пока вы не подпишетесь, поэтому вы можете применить преобразование в простом цикле.

public Mono<ResponseEntity> processSequentially(ServerHttpRequest request, List<JsonNode> reqBody) {
    RequestData reqData = this.prepareReqMetadata(request, reqBody);

    Mono ret = commonConnector.getApiResponse(reqData);

    reqBody.forEach(jsonNode -> ret.flatMap(resp -> resp.bodyToMono(JsonNode.class))
                                .flatMap(respBody -> getApiResponse(request, metadataRequestBuilder, respBody))
    );

    return ret;
}
...