如何在运行时创建一个 Mono 序列
How to create a sequence of Mono at runtime
我正在尝试根据用户输入动态创建一系列 Mono。我正在调用 rest APIs 并在 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 个或更多。
在您订阅之前什么都不会发生,因此您可以在一个简单的循环中应用转换。
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;
}
我正在尝试根据用户输入动态创建一系列 Mono。我正在调用 rest APIs 并在 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 个或更多。
在您订阅之前什么都不会发生,因此您可以在一个简单的循环中应用转换。
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;
}