使用服务器端事件的 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()
}

结果是:

  1. Jersey 的更高版本在连接断开时自动重新连接
  2. 重新连接时 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)
        }
    }
}