Spring WebFlux Kotlin Coroutines Binary Stream - PullRequest
0 голосов
/ 08 апреля 2020

Я пишу Rest API, который проксирует двоичные изображения. Я пытаюсь использовать поддержку, недавно добавленную в Spring WebFlux для сопрограмм Kotlin. В контроллере я делаю запрос в другой сервис, который возвращает двоичное изображение и затем передает это изображение вызывающему клиенту в теле ответа. Я использую DataBuffer, который, как я понял, не загрузит в память весь ответ другого сервиса. Но я получаю следующую ошибку:

Превышено ограничение на максимальное количество байтов в буфере: 262144

Я прочитал здесь посты, в которых описывается, как увеличить размер буфера, но это напрашивается на вопрос «Загружает ли DataBuffer все тело ответа в памяти?»

Двоичные изображения, с которыми я имею дело, могут иметь размер в ГБ.

Вот код моего контроллера.

    @GetMapping("/test")
    internal suspend fun proxy(
        request: ServerHttpRequest,
        @RequestParam("forwardUrl")
        forwardUrl: String
    ): ResponseEntity<StreamingResponseBody> {

        val stream = client.get()
            .uri(forwardUrl)
            .awaitExchange()
            .awaitBody<DataBuffer>()

        val responseBody: StreamingResponseBody = StreamingResponseBody { outputStream: OutputStream ->
            Unit
            stream.asInputStream().transferTo(outputStream)
        }

        return ResponseEntity<StreamingResponseBody>(responseBody, HttpStatus.OK)
    }

Как правильно выполнить потоковую передачу тела ответа запроса WebClient в тело ответа на запрос, обрабатываемый моим контроллером, без загрузки всего тела ответа в память?

Спасибо .

...