我正在使用Spring WebFlux进行项目。
过去,我曾使用StreamingResponseBody
将响应流式传输回客户端,但在WebFlux中找不到等效的代码。
例子:
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
@GetMapping("/video")
public StreamingResponseBody stream() {
InputStream videoStream = ...
StreamingResponseBody res = (os) -> { IOUtils.copy(videoStream, os); }
return res;
}
WebFlux是否有等效的
StreamingResponseBody
?还是应该导入传统的Spring MVC并将其混合?编辑:到目前为止,我已经通过访问
ServerHttpResponse
(下面的示例)来解决它。但是我仍然想知道更好的解决方案。@GetMapping("/video")
fun stream2(response: ServerHttpResponse): Mono<Void> {
val factory = response.bufferFactory()
val publisher = videoStream
.observeVideoParts()
.map { factory.wrap(it.bytes) }
return response.writeWith(publisher)
}
最佳答案
就目前而言,我发现的最佳解决方案是返回ServerHttpResponse
。
由于ServerHttpResponse
仅允许写入DataBuffer
对象,而不能写入ByteArray
对象,因此我做了一个扩展函数,在编写之前将它们包装起来:
fun ServerHttpResponse.writeByteArrays(bytes: Flux<ByteArray>): Mono<Void> {
val factory = this.bufferFactory()
val dataBuffers = bytes.map { factory.wrap(it) }
return this.writeWith(dataBuffers)
}
然后可以像这样简单地编写一个
Flux<ByteArray>
:@GetMapping("/video")
fun stream2(response: ServerHttpResponse): Mono<Void> {
val videoParts: Flux<ByteArray> = ...
return response.writeByteArrays(videoParts)
}
我仍然对其他解决方案持开放态度。