2团
Published on 2025-08-05 / 0 Visits
0
0

​​WebClient处理大体积响应​​的定制化配置

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


Comment