Spring WebFlux не передает ответ - PullRequest
0 голосов
/ 12 июня 2018

Я ожидал, что этот код будет передавать события клиенту (код на Kotlin, но Java очень похож)

@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
    }
}

ResultIterable - это итерация, которая генерирует строку через равные промежутки времени.В основном бесконечный поток.

Я не вижу никакого вывода, он зависает навсегда.

Я вижу, что строка печатается через равные промежутки времени (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'

1 Ответ

0 голосов
/ 12 июня 2018

Ваша ошибка здесь:

flux.subscribe({println(it)})

Вы подписаны на Flux и используете его непосредственно в методе.Когда Flux достигает HTTP-контейнера Reactor Netty, уже нечего потреблять.

Если вы действительно хотите println() каждый элемент, рассмотрите возможность использования doOnNext() вместо этого и действительно оставьте это subscribe()в контейнер.

Кроме того, вы должны действительно следовать правилам событий на стороне сервера:

Синтаксис потока событий на стороне сервера прост.Установите заголовок «Content-Type» в «text / event-stream».

https://www.w3schools.com/html/html5_serversentevents.asp

Итак, когда я делаю это:

@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
...