Потоковый ответ от HTTP-клиента с реактором Spring / Project - PullRequest
0 голосов
/ 03 декабря 2018

Как направить ответ от реактивного HTTP-клиента на контроллер, не имея полного тела ответа в памяти приложения в любое время?

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

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

Ответы [ 2 ]

0 голосов
/ 20 декабря 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();
}
0 голосов
/ 10 декабря 2018

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

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

...