Клиент JAX-RS, использующий Server Side Events, печатает те же элементы без завершения - PullRequest
0 голосов
/ 16 мая 2019

У меня есть служба, написанная на Spring WebFlux, которая возвращает поток элементов через SSE. Когда я сверну 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 Ответ

0 голосов
/ 17 мая 2019

Оказывается, что:

  1. Более поздние версии Джерси автоматически переподключаются при обрыве соединения
  2. Правильным поведением в SSE при переподключении является повторная отправка всех элементов (при условии конечной последовательности элементов)

Таким образом, может показаться, что, когда сервер заканчивает отправку элементов, ни ошибка, ни полные обратные вызовы не инициируются, а вместо этого восстанавливается соединение, которое, в свою очередь, пересылает все элементы.

Я смог получить то, что хотел, используя альтернативный шаблон из документации Джерси:

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)
        }
    }
}
...