我目前正在使用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")
}
“应用程序已启动”出现在日志消息中,但没有其他输出。
我做得有多糟,或者这是一个错误?
答案 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")
}