Skip to content

WebClient 에서 Exceeded limit on max bytes to buffer : 262144 에러가 발생하는 경우 #167

@occidere

Description

@occidere

상황

  • WebClient 를 통해 대용량 데이터를 가져오는 경우 아래와 같은 에러 발생
    Caused by: org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
        at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:99) ~[spring-core-5.3.16.jar:5.3.16]
        Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 

원인

  • Spring boot가 2.2.x, Spring framework : 5.2.x 가 되면서 WebClient에 설정되는 default codec의 buffer size가 변경된 것으로 추정
  • 예전엔 아래와 같이 config 를 변경해서 해결할 수 있었으나, default codec 값이 hard coded 되어서 config 로 이제는 수정 불가
    spring:
      codec:
        max-in-memory-size: 100MB

해결

  • WebClient 빌드 시 ExchangeStrategies 를 사용하여 codec 을 주입해야 함
    @Bean
    fun webClient() = WebClient.builder()
        .baseUrl(baseUrl)
        .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE)
        .defaultHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0")
        .exchangeStrategies(
            ExchangeStrategies.builder()
                .codecs { configurer ->
                    configurer.defaultCodecs()
                        .maxInMemorySize(-1) // unlimited mem size
                }.build()
        ).build()

참고

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions