未调用ktor中的应用程序级事件

时间:2019-02-08 18:19:08

标签: kotlin netty ktor

我目前正在使用Netty在ktor中尝试应用程序事件。但是,唯一被调用的钩子是“ 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 :(得分:1)

好吧,我一直在研究并发现,调用的应用程序级事件的数量取决于您所使用的服务器。以下嵌入式服务器支持以下事件:

+--------+----------+---------+---------------+----------+---------+
| 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")
}