Ktor responseTextWriter жалуется на неправильный вызов метода блокировки - PullRequest
1 голос
/ 16 марта 2020

Я внедряю сервер с использованием Ktor, и один из вызовов заключается в получении (потенциально большого) списка пользователей, которые будут получены из запроса к базе данных. Я хотел бы разделить свой ответ на части, поэтому мой пользовательский вызов выглядит следующим образом:

    fun users() =
        flow {
            emit("A")
            emit("B")
            emit("C")
        }

Где вызовы emit будут в конечном итоге заменены данными из набора результатов. Маршрут выглядит следующим образом:

        route("Users") {
            get() {
                call.respondTextWriter {
                    users().collect { write(it) }
                    flush()
                }
            }
            // other calls, e.g. post(), delete(), etc.

Однако оба вызова write и flush показывают предупреждение: «Неправильный вызов метода блокировки». Чего мне не хватает?

Спасибо.

1 Ответ

0 голосов
/ 17 марта 2020

Эх, небольшое копание дало ответ:

private suspend fun <T> flowResponse(writer: Writer, flow: Flow<T>) {
    val gson = Gson()
    flow.collect { data ->
        withContext(Dispatchers.IO) {
            writer.write(gson.toJson(data))
        }
    }
    withContext(Dispatchers.IO) { writer.flush() }
}

А потом:

            get() {
                call.respondTextWriter {
                    flowResponse(this, Users.all())
                }
            }

Небольшое изменение вопроса, поскольку мой вызов Users.all() возвращает объект User, который затем конвертируется в JSON. Возможно, есть способ просто выполнить потоковую передачу объектов и позволить посреднику по контенту выполнить перевод, но я пока не получил.

...