【问题标题】:How to create a sequence of Mono at runtime如何在运行时创建 Mono 序列
【发布时间】:2019-11-20 02:57:50
【问题描述】:

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

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

public Mono&ltResponseEntity&gt processSequentially(ServerHttpRequest request, JsonNode reqBody) { RequestData reqData = this.prepareReqMetadata(request, reqBody); 返回 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 或更多。

【问题讨论】:

    标签: java spring project-reactor reactor-netty


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多