使用服务器端事件的 JAX-RS 客户端打印相同的项目而不完成
JAX-RS Client using Server Side Events prints the same items without completing
我有一个用 Spring WebFlux 编写的服务,它通过 SSE 返回项目的 Flux。当我卷曲 URL 时,将显示事件并退出命令。我正在尝试使用下面的 JAX-RS 客户端代码来执行相同的操作。
代码执行并显示所有项目但从不退出。一旦显示了最后一个项目的事件,它将再次从第一个开始。永远不会调用完整事件的事件处理程序。
fun loadAll() {
val target = client.target(baseURL)
val source = SseEventSource
.target(target)
.build()
val onEvent = { event: InboundSseEvent ->
println(event)
}
val onError = { _: Throwable ->
println("onError")
}
val onComplete = {
println("onComplete")
source.close()
}
source.register(onEvent, onError, onComplete)
source.open()
}
结果是:
- Jersey 的更高版本在连接断开时自动重新连接
- 重新连接时 SSE 中的正确行为是重新发送所有项目(假设项目的序列有限)
因此看起来当服务器完成发送项目时,既不会触发错误回调也不会触发完成回调,而是连接 re-established,这又会重新发送所有项目。
我能够使用 Jersey 文档中的替代模式得到我想要的东西:
fun loadAll() {
val target = client.target(baseURL)
val input = target.request().get(EventInput::class.java)
while(!input.isClosed) {
val inboundSseEvent = input.read()
if(inboundSseEvent != null) {
val thing = inboundSseEvent.readData(Thing::class.java, MediaType.APPLICATION_JSON_TYPE)
process(thing)
}
}
}
我有一个用 Spring WebFlux 编写的服务,它通过 SSE 返回项目的 Flux。当我卷曲 URL 时,将显示事件并退出命令。我正在尝试使用下面的 JAX-RS 客户端代码来执行相同的操作。
代码执行并显示所有项目但从不退出。一旦显示了最后一个项目的事件,它将再次从第一个开始。永远不会调用完整事件的事件处理程序。
fun loadAll() {
val target = client.target(baseURL)
val source = SseEventSource
.target(target)
.build()
val onEvent = { event: InboundSseEvent ->
println(event)
}
val onError = { _: Throwable ->
println("onError")
}
val onComplete = {
println("onComplete")
source.close()
}
source.register(onEvent, onError, onComplete)
source.open()
}
结果是:
- Jersey 的更高版本在连接断开时自动重新连接
- 重新连接时 SSE 中的正确行为是重新发送所有项目(假设项目的序列有限)
因此看起来当服务器完成发送项目时,既不会触发错误回调也不会触发完成回调,而是连接 re-established,这又会重新发送所有项目。
我能够使用 Jersey 文档中的替代模式得到我想要的东西:
fun loadAll() {
val target = client.target(baseURL)
val input = target.request().get(EventInput::class.java)
while(!input.isClosed) {
val inboundSseEvent = input.read()
if(inboundSseEvent != null) {
val thing = inboundSseEvent.readData(Thing::class.java, MediaType.APPLICATION_JSON_TYPE)
process(thing)
}
}
}