繁体   English   中英

Spring 助焊剂<jsonnode>等待数组完成填充导致阻塞</jsonnode>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM