spring - Spring WebFlux 没有流式响应
问题描述
我期待这段代码将事件流式传输到客户端(代码在 Kotlin 中,但 Java 非常相似)
@RestController
object CustomerController {
@GetMapping("/load", produces = arrayOf("application/stream+json"))
fun load(): Flux<String> {
var flux = Flux.fromIterable(ResultIterable())
flux.subscribe({println(it)})
return flux
}
}
ResultIterable 是一个迭代器,它定期生成一个字符串。基本上是无限流。
我没有看到任何输出,它永远挂起。
我确实看到定期打印字符串(println(it))。
我正在使用以下卷曲:
curl -X GET http://localhost:8080/load -H 'accept: application/stream+json' -H 'cache-control: no-cache' -H 'content-type: application/stream+json'
解决方案
你的错误在这里:
flux.subscribe({println(it)})
您订阅Flux
并直接在方法中使用它。当它Flux
到达 Reactor Netty HTTP 容器时,已经没有任何东西可以消费了。
如果您真的想要println()
每个项目,请考虑doOnNext()
改用并将其真正留给subscribe()
容器。
此外,您必须真正遵循服务器端事件规则:
服务器端事件流语法很简单。将“Content-Type”标头设置为“text/event-stream”。
https://www.w3schools.com/html/html5_serversentevents.asp
所以,当我这样做时:
@GetMapping("/load", produces = [MediaType.TEXT_EVENT_STREAM_VALUE])
fun load() =
Flux.just("foo", "bar", "baz")
.doOnNext({ println(it) })
我开始在连接的客户端中获取服务器端事件:
C:\tmp\so50823339>curl -X GET http://localhost:8080/load
data:foo
data:bar
data:baz
C:\tmp\so50823339>
同时我在服务器上获取提到的日志doOnNext()
:
2018-06-12 17:33:37.453 INFO 6800 --- [ main] c.e.s.s.So50823339ApplicationKt : Started So50823339ApplicationKt in 3.112 seconds (JVM running for 3.924)
foo
bar
baz
推荐阅读
- opentok - 在移动设备上,如何修复 OpenTok Call 窗口?
- c# - ASP.NET 验证、单选按钮和文本框
- amazon-web-services - 如何在 Terraform 中使用密钥管理器创建 Aurora Serverless 数据库集群
- mysql - 从 CSV 更新 MySQL 中的特定列
- c# - WPF Bing 地图 - 缩放到折线
- python - 为什么这个脚本的输出是一个无列表?
- uiveri5 - 如果存在,请单击元素
- java - 预授权和可维护性
- python - python 字符串格式化 - 隐式 str() + 格式说明符
- python - 使用python代码从excel条件文件中将刺激设置到某些位置