java webclient客户端响应内存问题

f8rj6qna  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(557)

有一个数据库,它有两个唯一的密钥。有一个api托管来查看数据库的值,比如说图书数据库,它有一个图书id和另一个唯一的id。api接受唯一的id并以json格式返回图书的完整信息。这个信息非常大。我想创建一个mapper程序,它可以在这个api的帮助下将一个惟一的id转换成一个图书id。我正在创建一个具有

webClient = WebClient.builder().baseUrl(host).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .defaultHeader("Authorization", apiAuth).defaultHeader("Accept-Encoding", "gzip, deflate")
                .build();

所需的书籍细节将包含在主机uri中,例如。 https://example.com/book?uniqueCode=I03909&size=1 通过给多个带有逗号的唯一代码和给定大小值,可以实现多条记录。
我通过以下方式发出get请求:

String response = webClient.get().uri(
            uriBuilder -> uriBuilder.path("/books/")
                    .queryParam("ucodes", ucodes)
                    .queryParam("size", ucodesList.size())
                    .build())
            .retrieve().bodyToMono(String.class).block();

我在这里给出逗号分隔的ucodes和大小。然后我得到一个json字符串,它有图书列表,每个图书都有很多字段,包括图书id、作者、出版年份等。但问题是我只需要图书id数据,但是有很多数据正在提交,所以缓冲区已经满了,异常就来了。是否有任何方法可以过滤并仅获取所需的数据,并防止此缓冲区已满异常。
答案是:

{
"books":[
{
"ucode":"reer2121"
"bookId":"22"
"author":.........
......
......
......

}
]
}

例外情况如下:

org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
    at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:101)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    |_ checkpoint ⇢ Body from GET http....
p5fdfcr1

p5fdfcr11#

我不知道是否有一种方法可以过滤你所需要的,如果api是这样建模的。
您可以增加数据缓冲限制

webClient = WebClient.builder().baseUrl(host).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .exchangeStrategies(ExchangeStrategies.builder()
                        .codecs(configurer -> configurer
                                .defaultCodecs()
                                .maxInMemorySize(10 * 1024 * 1024)) // 10 MB
                        .build())
                .defaultHeader("Authorization", apiAuth).defaultHeader("Accept-Encoding", "gzip, deflate")
                .build();

它增加到处理10MB,如果需要,可以添加更多。

相关问题