如何在运行时创建Mono序列

时间:2019-07-10 13:08:22

标签: java spring project-reactor reactor-netty

我正在尝试根据用户输入动态创建Mono序列。我正在调用其余的API,并在Mono中获得ClientResponse。我的用例是按顺序调用2个或更多API,下一个API的输入有效载荷取决于前一个API的输出。

我的硬编码序列操作看起来像


    public Mono<ResponseEntity> 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 个答案:

答案 0 :(得分:1)

订阅之前什么都不会发生,因此您可以在一个简单的循环中应用转换。

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;
}