2009-10-11 33 views
37

Necesito guardar algunos datos preferiblemente cuando se detiene la aplicación java web, o cuando se detiene tomcat. ¿Cómo se puede hacer esto? Editar: cualquier inconveniente si utilizo el gancho de cierre jvm?shutdown hook para la aplicación web java

Respuesta

52

utilizar una clase que implementa ServletContextListener en su web.xml:

<web-app> 
    <!-- Usual stuff here --> 
    <listener> 
     <listener-class>com.mycompany.MyClass</listener-class> 
    </listener> 
</web-app> 
+12

** Incluso más fácil ahora ... ** La anotación ['@ WebListener'] (http://docs.oracle.com/javaee/7/api/javax/servlet/annotation/WebListener.html) se agregó a [Servlet 3.0 espec] (https://jcp.org/en/jsr/detail?id=315) ahora le ofrece este comportamiento sin la molestia de editar el archivo web.xml. Ver esta iluminadora [respuesta de BalusC] (http://stackoverflow.com/a/9186070/642706). –

14

¿Por qué quiere hacerlo específicamente durante el apagado? ¿Y realmente necesita para guardarlo (como en "¿es absolutamente crítico?") O ¿podría como para (como en "estaría bien pero viviré sin él")?

La distinción es importante - no importa qué método se intenta (oyente servlet/contexto como sugieren otras respuestas o JVM shutdown hook) hay hay garantías que en realidad será invocado.

Los eventos de destrucción del detector de escuchas/servlets/contextos solo se desencadenarían durante el apagado normal (correcto) del contenedor O durante la recarga de la aplicación. El gancho de cierre de JVM también se activaría durante la interrupción del proceso; sin embargo, matar un proceso (o cortar el poder) obviamente no desencadenaría ninguno.

+1

Está en la categoría "Sería bueno pero viviré sin él". Necesito guardar un montón de estados de servidores que mi aplicación está tratando de conectar a un archivo (no db) cuando la aplicación se apaga y luego volver a cargar esta información cuando la aplicación se inicia de nuevo. Si mi aplicación intenta conectarse a un servidor y está inactiva, la marca como inactiva para que no tenga que volver a intentarlo. Dado que las consultas suceden con frecuencia, solo marco estos estados en la memoria, no en el archivo. Por lo tanto, cuando la aplicación se cierre, sería bueno recordar qué servidores están caídos. – user121196

+0

Me estoy inclinando hacia ServletContextListener o JVM hook – user121196

+5

No utilice un enlace JVM: eso es más para Tomcat mismo o para aplicaciones de escritorio. Definitivamente debería preferir un ServletContextListener sobre un enlace JVM. –

3

Sugiero usar ehcache para almacenar en caché esta información. Si usa el almacén persistente de ehcache, cuando inicie Tomcat nuevamente, los datos en caché seguirán estando disponibles.

En efecto, esto delega el problema a ehcache, que está optimizado para este tipo de problemas.

11

Como complemento a la respuesta de leonm:

Si utiliza primavera, se puede utilizar "la gestión del ciclo de vida" de la primavera para lograr un efecto similar. Por ejemplo, puede anotar un método en un bean con @PreDestroy para que se invoque automáticamente al apagar el contenedor. De esta forma, no necesita poner nada en el web.xml.

Ver Spring beans factory lifecycle.

Cuestiones relacionadas