2

我目前正在使用 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")
}

“应用程序已启动”出现在日志消息中,但没有其他输出。

我做得有多糟糕,或者这是一个错误?

4

1 回答 1

4

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

+--------+----------+---------+---------------+--- --------+----------+
| 引擎 | 开始 | 开始 | 停止准备 | 停止 | 停止 |
+--------+----------+---------+---------------+--- --------+----------+
| 网状 | 否 | 是 | 否 | 否 | 否 |
| 首席信息官 | 否 | 是 | 是 | 是 | 是 |
| 雄猫 | 否 | 是 | 否 | 否 | 否 |
| 码头 | 否 | 是 | 否 | 否 | 否 |
+--------+----------+---------+---------------+--- --------+----------+

在 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")
}
于 2019-02-09T20:17:28.467 回答