我正在使用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)
}

我仍然对其他解决方案持开放态度。

10-05 18:54