未调用 ktor 中的应用程序级事件
Posted
技术标签:
【中文标题】未调用 ktor 中的应用程序级事件【英文标题】:application-level events in ktor not invoked 【发布时间】:2019-07-03 00:51:30 【问题描述】:我目前正在使用 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】:好的,我一直在研究这一点,发现调用的应用程序级事件的数量取决于您使用的服务器。以下嵌入式服务器支持以下事件:
+--------+----------+---------+---------------+--- --------+----------+ |引擎 |开始 |开始 |停止准备 |停止 |停止 | +--------+----------+---------+---------------+--- --------+----------+ |网状 |否 |是 |否 |否 |否 | |首席信息官 |否 |是 |是 |是 |是 | |雄猫 |否 |是 |否 |否 |否 | |码头 |否 |是 |否 |否 |否 | +--------+----------+---------+---------------+--- --------+----------+在 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")
【讨论】:
以上是关于未调用 ktor 中的应用程序级事件的主要内容,如果未能解决你的问题,请参考以下文章
数据类中的默认参数未使用 ktor 序列化程序转换为 json
Android Studio 未看到 Ktor 序列化程序(未找到“用户”类的序列化程序。)
如何使用带有 ktor 框架的 graphql-kotlin 进行字段级解析器