события уровня приложения в ktor не вызываются - PullRequest
0 голосов
/ 08 февраля 2019

В настоящее время я экспериментирую с событиями приложения в ktor, используя Netty.Однако единственный вызываемый хук - это ApplicationStarted.Что я здесь не так делаю?

Я установил точки останова во всех функциях, подписки выполняются, но не все прослушиватели событий вызываются.Также я попытался найти какое-то объяснение в документации ktor, но это не удалось.

import io.ktor.application.*

fun Application.events(){
    environment.monitor.subscribe(ApplicationStarting, ::onStarting)
    environment.monitor.subscribe(ApplicationStarted, ::onStarted)
    environment.monitor.subscribe(ApplicationStopping, ::onStopping)
    environment.monitor.subscribe(ApplicationStopped, ::onStopped)
    environment.monitor.subscribe(ApplicationStopPreparing, ::onPrepareStop)
}

private fun onStarting(app: Application){
    app.log.info("Application starting")
}
private fun onStarted(app: Application){
    app.log.info("Application started")
}
private fun onStopping(app: Application){
    app.log.info("Application stopping")
}
private fun onStopped(app: Application){
    app.log.info("Application stopped")
}
private fun onPrepareStop(env: ApplicationEnvironment){
    env.log.info("Preparing App Stop")
}

«Приложение запущено» появляется в сообщениях журнала, но нет других выходных данных.

Насколько я плохделать, или это ошибка?

1 Ответ

0 голосов
/ 09 февраля 2019

Хорошо. Я изучил это и обнаружил, что количество вызванных событий уровня приложения зависит от сервера, который вы используете.Следующие встроенные серверы поддерживают следующие события:

+--------+----------+---------+---------------+----------+---------+
| Engine | Starting | Started | StopPreparing | Stopping | Stopped |
+--------+----------+---------+---------------+----------+---------+
| Netty  | NO       | YES     | NO            | NO       | NO      |
| CIO    | NO       | YES     | YES           | YES      | YES     |
| Tomcat | NO       | YES     | NO            | NO       | NO      |
| Jetty  | NO       | YES     | NO            | NO       | NO      |
+--------+----------+---------+---------------+----------+---------+

Протестировано на Ktor версии 1.1.2

Таким образом, в настоящее время кажется, что если вы хотите отвечать на события остановки приложений, вам следует использовать CIO в качествесервер.

РЕДАКТИРОВАТЬ:

CIO не поддерживает HTTPS на данный момент, поэтому при необходимости вы должны придерживаться одного из трех других.Однако вы можете использовать обработчик завершения работы JVM, чтобы вызвать остановленное событие самостоятельно.Помните, что обработчики вызываются в другом потоке.

private fun onStarted(app: Application){
    Runtime.getRuntime()?.addShutdownHook( Thread {
        app.environment.monitor.raise(ApplicationStopped, app)
    })
    app.log.info("Application started")
}
...