
[英]Processing paged WebClient response without waiting and blocking for next page in a Flux
[英]Spring Flux<JSONNODE> waiting for array to finishing populating causes blocking
我正在调用一个 API 端点,它返回数据为
{"length":850,"maxPageLimit":2500,"totalRecords":1700,
"data":[
{"date":"2022-06-29","newCasesByPublishDate":14476,"cumCasesByPublishDate":2005335},
{"date":"2022-06-26","newCasesByPublishDate":0,"cumCasesByPublishDate":1990859},
....
]}
#Response headers
X-Firefox-Spdy h2
cache-control public, must-revalidate, max-age=90
content-encoding gzip
content-location https://api......&format=json&page=1
content-security-policy default-src 'none'; style-src 'self' 'unsafe-inline'
content-type application/vnd.PHE-COVID19.v1+json; charset=utf-8
我想将数据数组中的每个条目作为通量 jsonnode stream 返回。 但是,在执行此操作之前,它会等待数组完成。 如何防止 web 客户端调用等待并阻塞调用,直到阵列完成? 或者这是预期的行为,我需要向所有者 API 请求更改以响应方式发送数据?
public Flux<JsonNode> fetchCovidStatsFor(Area area, AreaType areaType, List<Metrics> metricsList) {
var request = generateWebClient().get()
.uri(uriBuilder -> uriBuilder
.queryParam(buildRequestFilters(area, areaType))
.queryParam(buildRequestStructures(metricsList))
.build())
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
log.debug("request URI: {}", request.httpRequest(ClientHttpRequest::getURI));
return request.retrieve()
.bodyToFlux(JsonNode.class)
.map(jsonNode -> jsonNode.get("data"))
.doOnNext(jsonNode -> {System.out.println(jsonNode);});
}
编辑:
要清楚数据来自文件并且可以从数组中获取数据,但是,这会等待整个数组准备好并导致“超出每个 JSON 对象的最大字节数限制” - 我知道我可以修复通过增加缓冲区,但如果可能的话,我想通过从文件中流式传输数组中的每个条目来避免这种情况。
.bodyToFlux(JsonNode.class)
.flatMapIterable(jsonNode -> jsonNode.get("data"))
调用的 API 控制数据流,因此应将其更改为生成数据为 stream。 这是使用MediaType.APPLICATION_NDJSON_VALUE
的示例 API :
@GetMapping(produces = MediaType.APPLICATION_NDJSON_VALUE)
public Flux<JsonNode> list(){
return service.list().delayElements(Duration.ofSeconds(1));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.