项目使用 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();
    }