来自带有Spring / Project反应器的HTTP客户端的流响应

时间:2018-12-03 10:38:02

标签: spring-boot project-reactor reactive-streams

如何在不将整个响应主体随时放在应用程序内存中的情况下,将响应从响应HTTP客户端流传输到控制器?

几乎所有项目反应器客户返回Mono<T>的示例。据我了解,反应流与流有关,而不是全部加载然后发送响应。

是否可以返回一种Flux<Byte>,从而可以将大型文件从某些外部服务传输到应用程序客户端,而无需使用大量的RAM存储器来存储中间结果?

2 个答案:

答案 0 :(得分:0)

应该自然而然地通过简单地返回一个Flux<WHATEVER>来完成,其中将尽快将每个对象都刷新到网络上。在这种情况下,响应将使用分块的HTTP编码,并且一旦将每个块的字节传送到网络后,它们就会被丢弃。

另一种可能性是将HTTP响应升级到SSE(服务器发送事件),这可以通过将Controller方法设置为类似@GetMapping(path = "/stream-flux", produces = MediaType.TEXT_EVENT_STREAM_VALUE)produces部分)的方式在WebFlux中实现。是重要的)。

答案 1 :(得分:0)

我认为您不需要创建事件流,因为事件流更常用于实时发出事件,我认为您最好这样做。

@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();
}