项目使用 WebClient 作为 HTTP 客户端时,在下载大型图片过程中因默认缓冲区不足会抛出 DataBufferLimitException
。
现通过以下配置扩展内存缓冲区限制:
public HttpClient customHttpClient() {
var connectionProvider = ConnectionProvider.builder("httpPool")
.maxConnections(64)
.pendingAcquireTimeout(Duration.ofSeconds(30))
.maxIdleTime(Duration.ofMinutes(5))
.build();
return HttpClient
.create(connectionProvider)
.protocol(HttpProtocol.HTTP11)
.compress(true)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
.compress(true)
.doOnConnected(conn -> conn
.addHandlerLast(new ReadTimeoutHandler(10, TimeUnit.SECONDS))
.addHandlerLast(new WriteTimeoutHandler(10, TimeUnit.SECONDS)))
.responseTimeout(Duration.ofSeconds(60));
}
@Bean
public WebClient webClient() {
// 获取图片的响应内容较大,因此需要设置较大的内存限制
int size = 16 * 1024 * 1024;
// 2. 创建自定义的 ExchangeStrategies 来设置内存限制
var strategies = ExchangeStrategies.builder()
.codecs(codecs -> codecs.defaultCodecs()
.maxInMemorySize(size)
)
.build();
var httpClient = customHttpClient();
return WebClient.builder()
.exchangeStrategies(strategies)
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}