Потоковый ответ от HTTP-клиента с помощью реактора Spring / Project

Как передать ответ от реактивного HTTP-клиента контроллеру без сохранения всего тела ответа в памяти приложения в любое время?

Практически все примеры проектного реактора-клиента возвращают Mono<T>. Насколько я понимаю, реактивные потоки связаны с потоковой передачей, а не с загрузкой всего и последующей отправкой ответа.

Можно ли вернуть вид Flux<Byte>, чтобы можно было передавать большие файлы из некоторой внешней службы клиенту приложения без необходимости использования огромного объема оперативной памяти для хранения промежуточного результата?


person Community    schedule 03.12.2018    source источник


Ответы (2)


Это должно быть сделано естественным образом, просто возвращая Flux<WHATEVER>, где каждый WHATEVER будет сброшен в сеть как можно скорее. В таком случае в ответе используется кодирование HTTP по фрагментам, и байты из каждого фрагмента отбрасываются после того, как они были переданы в сеть.

Другая возможность - обновить HTTP-ответ до SSE (Server Sent Events), что может быть достигнуто в WebFlux, установив для метода Controller что-то вроде @GetMapping(path = "/stream-flux", produces = MediaType.TEXT_EVENT_STREAM_VALUE) (часть produces является важной).

person Simon Baslé    schedule 10.12.2018
comment
Может WHATEVER байтовым массивом? Я действительно не понимаю, как, скажем, Array<Byte>, объект может передаваться в потоковом режиме, а не загружаться через клиент и повторно отправляться через контроллер. - person ; 11.12.2018

Я не думаю, что в вашем сценарии вам нужно создать поток событий, потому что поток событий больше используется для генерации события в реальном времени, я думаю, вам лучше сделать это так.

@GetMapping(value = "bytes")
public Flux<Byte> getBytes(){
    return byteService.getBytes();
}

и вы можете отправить это как поток. если вы все еще хотите это как поток

@GetMapping(value = "bytes",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<List<Byte>> getBytes(){
    return byteService.getBytes();
}
person Ricard Kollcaku    schedule 20.12.2018