Spring Web Flux Web 客户端未一一接收值
Spring Web Flux web client doesn't receive value one by one
@GetMapping("/test")
fun fluxTest(): Flux<Int> {
return Flux.create {em ->
Thread{
(0..10).forEach{
em.next(it)
Thread.sleep(1000)
}
em.complete()
}.run()
}
}
所以上面的代码是一个 Spring MVC 控制器方法,以 1 秒的间隔发出 0 ~ 10 个数字。
这是我的客户端代码。
val client = WebClient.builder().baseUrl("http://localhost:8083/api/v1")
.build()
val disposable = client.get()
.uri("/test")
.retrieve()
.bodyToFlux(Int::class.java)
.subscribe ({
System.out.println("Value arrived : $it")
}, {err ->
err.printStackTrace()
})
问题是客户端程序一次打印0~10,而不是1秒一个一个打印。
所以它不会一个一个地打印来自服务器的值,而是在流完成时打印整个接收到的值。
谁能帮我解决这个问题?
谢谢
看起来你应该启用服务器发送的事件,简单的方法只需将生产者添加到 enpoint,如下所示:
@GetMapping(path = "/test", produces=MediaType.TEXT_EVENT_STREAM_VALUE)
@GetMapping("/test")
fun fluxTest(): Flux<Int> {
return Flux.create {em ->
Thread{
(0..10).forEach{
em.next(it)
Thread.sleep(1000)
}
em.complete()
}.run()
}
}
所以上面的代码是一个 Spring MVC 控制器方法,以 1 秒的间隔发出 0 ~ 10 个数字。
这是我的客户端代码。
val client = WebClient.builder().baseUrl("http://localhost:8083/api/v1")
.build()
val disposable = client.get()
.uri("/test")
.retrieve()
.bodyToFlux(Int::class.java)
.subscribe ({
System.out.println("Value arrived : $it")
}, {err ->
err.printStackTrace()
})
问题是客户端程序一次打印0~10,而不是1秒一个一个打印。
所以它不会一个一个地打印来自服务器的值,而是在流完成时打印整个接收到的值。
谁能帮我解决这个问题?
谢谢
看起来你应该启用服务器发送的事件,简单的方法只需将生产者添加到 enpoint,如下所示:
@GetMapping(path = "/test", produces=MediaType.TEXT_EVENT_STREAM_VALUE)