@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
}
}
我确实看到字符串按规则间隔打印(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)})
您订阅流量
并直接在方法中使用它。当这个流量
到达Reactor Netty HTTP容器时,已经没有什么可以消耗的了。
如果您真的希望println()
每个项,请考虑使用doonnext()
,并将subscribe()
留给容器。
所以,当我这样做的时候:
@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
流式响应 当数据产生的时候发送数据 使用分块传输编码(Chunked transfer encoding)的流式 JOSN 响应。 Server server.go package main import ( "net/http" "time" "encoding/json" "github.com/labstack/echo" ) type ( Geolo
问题内容: 问题很简单:假设我有一个完全可响应的后端,如何将其流式传输到浏览器(例如大文本),并在每个块来自服务器时立即将它们打印给用户? 可能我缺少一些重要的概念性要点,但是我所需要知道的是:是否可以通过一个HTTP GET(或否)请求发送少量数据(从服务器到浏览器)?关键是:在发送全部数据之前,我可以写那些小的部分吗? 谢谢你的帮助。我以前确实尝试过google,但是我总是会得到其他概念(例如
我正在使用SpringWebSockets,我想从存储库返回一个项目列表 我怎么能在WebSocket会话中发送此列表 这是如何将项目列表发送到websocket的处理程序方法
下面的代码是否阻止调用,如果是,如何使其成为非阻塞?i、 e.使反应式Java流的使用变得无用?如何在不阻塞呼叫的情况下分页? 目前,我有一个webClient调用后端服务,该服务返回
问题内容: 我正在使用Java远程方法调用(RMI)测试Web应用程序。当我通过加密狗,宽带连接到Internet时;RMI需要很长时间才能响应请求。完成方法调用大约需要10秒钟。我还可以看到,一旦进行方法调用,互联网连接中的数据传输速率就会提高。因此,显然,它似乎正在通过外部网络在两个内部进程之间建立RMI连接。 与互联网断开连接后,它的响应变化很快,例如几毫秒。我的/ etc / hosts文
我正在评估使用Spring Webflux,但我们必须支持期望Application/JSON,而不是Application/Stream+JSON的客户机。我不清楚Spring WebFlux如何在需要Application/JSON的客户机的情况下处理Flux的序列化。 如果一个Flux序列化为application/json,而不是application/stream+json,这是一个阻塞