servlets - quartz - ¿Cómo puedo hacer que un ServletContextListener detenga la aplicación Java EE?
servletcontextlistener spring (2)
En su oyente, capture cualquier excepción y use atributos de contexto de servlet para almacenar indicadores u otra información útil sobre el error. Probablemente también deba registrar algo para indicar que la aplicación no es funcional.
En este punto, sus opciones pueden estar dictadas por la arquitectura de su aplicación. Si todas las solicitudes son manejadas por un solo servlet de controlador / despachador, podría tener sentido que su método init
verificara los atributos de contexto y lanzara una UnavailableException
. Solo tenga en cuenta que la excepción solo se aplica al servlet específico que la arroja. Esto hace que el enfoque sea menos manejable si su aplicación contiene muchos servlets o permite el acceso directo a otros recursos.
Otra opción sería crear un filtro que intercepte cada solicitud, verifique los atributos del contexto y luego arroje una excepción. Otras variaciones son ciertamente posibles.
Tengo un ServletContextListener que realiza algunas funciones de administración de bases de datos cuando se inicia mi aplicación Java EE. Esto se ejecuta en mi aplicación antes de que JPA y otras piezas de la aplicación se inicien / carguen. Si el mantenimiento de la base de datos falla, estoy registrando los errores. Si el mantenimiento de la base de datos falla, la aplicación no funcionará correctamente y me gustaría detener la aplicación.
¿Cómo puedo detener la aplicación de ServletContextListener.contextInitialized correctamente y correctamente?
La solución dada por Viven a continuación está cerca pero no del todo. Cuando tiro un RuntimeException, Glassfish se queda en un estado incoherente en el que no se puede acceder a su consola de administración, pero aún se está ejecutando algún proceso y mantiene abierto el puerto 3700 (IIOP?), Lo que impide un reinicio.
Si su ServletContextListener
arroja una excepción, la aplicación web no se cargará correctamente y el servidor de aplicaciones puede bloquear todas las solicitudes posteriores (y responder con un error de 500).
No es exactamente lo que impide que la aplicación se inicie, ni detiene la aplicación, pero impide cualquier uso posterior de la aplicación y podría ser útil en su caso.
Después de la verificación adecuada en la especificación, este comportamiento no es obligatorio en la especificación. El servidor puede (no debe ) devolver 500 errores. Esta solución debe usarse con cuidado, por lo tanto.
Vea esta respuesta para una cita de la especificación del servlet.