弹簧通量等待<JSONNODE>阵列完成填充导致阻塞



我正在调用一个返回数据为

的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流。然而,它等待数组完成之前这样做。如何防止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控制数据流,因此应该将其更改为将数据作为流生成。这是一个使用MediaType.APPLICATION_NDJSON_VALUE的API示例:

@GetMapping(produces = MediaType.APPLICATION_NDJSON_VALUE)
public Flux<JsonNode> list(){
return service.list().delayElements(Duration.ofSeconds(1));
}  

最新更新