Actualmente estoy experimentando con eventos de aplicaciones en ktor usando Netty. Sin embargo, el único enlace al que se llama es "ApplicationStarted". ¿Qué estoy haciendo mal aquí?
Establecí puntos de interrupción en todas las funciones, las suscripciones se realizan pero no se invocan todos los detectores de eventos. También traté de encontrar alguna explicación en los documentos de ktor, pero no tuve éxito.
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") }Aparece "Aplicación iniciada" en los mensajes de registro, pero ningún otro resultado.
¿Qué tan mal lo estoy haciendo, o es esto un error?
Ok, estuve investigando esto y descubrí que la cantidad de eventos de nivel de aplicación invocados depende del servidor que esté utilizando. Los siguientes servidores incorporados admiten los siguientes eventos:
+--------+----------+---------+---------------+--- -------+---------+ | Motor | Comenzando | Iniciado | Dejar de preparar | Parando | Detenido | +--------+----------+---------+---------------+--- -------+---------+ | Neto | NO | SÍ | NO | NO | NO | | director de información | NO | SÍ | SÍ | SÍ | SÍ | | gato | NO | SÍ | NO | NO | NO | | Embarcadero | NO | SÍ | NO | NO | NO | +--------+----------+---------+---------------+--- -------+---------+
Probado en Ktor versión 1.1.2
Por lo tanto, actualmente parece que si desea responder a eventos de detención de aplicaciones, debe usar CIO como servidor.
EDITAR:
CIO no es compatible con HTTPS a partir de ahora, por lo que, si es necesario, debe ceñirse a uno de los otros tres. Sin embargo, puede usar el enlace de apagado del tiempo de ejecución de JVM para generar un evento detenido usted mismo. Tenga en cuenta que los controladores se invocan en un subproceso diferente.
private fun onStarted(app: Application){ Runtime.getRuntime()?.addShutdownHook( Thread { app.environment.monitor.raise(ApplicationStopped, app) }) app.log.info("Application started") }