未调用 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 进行字段级解析器

未找到“响应”类的 Ktor 序列化程序

Ktor 应用程序未在使用 IntelliJ IDEA 的 Kotlin 多平台项目中运行

Ktor 客户端的 JsonFeature 未解决