tutorial homepage example grails groovy service application-lifecycle

example - grails homepage



¿Cuál es la mejor forma de que una clase de servicio de Grails detecte el cierre de la aplicación? (4)

Tengo una clase de servicio de Grails que necesita realizar algunas tareas de limpieza cuando mi servidor de aplicaciones Tomcat se apaga.

No veo nada en los documentos de Grails sobre un método service.stop () o destroy (), o una forma de implementar cualquier tipo de escucha del ciclo de vida de la aplicación.

¿Cuál es la mejor manera de hacer esto?

¡Gracias!


Intentaría inyectar el servicio en Bootstrap y luego llamar al método desde el bloque de destrucción, ya que el bloque de destrucción se ejecuta cuando la aplicación finaliza, algo como esto:

class BootStrap { def myService def init = {servletContext -> } def destroy = { myService.cleanUp() } }


No es exactamente lo mismo que un método de eliminación de servicios, pero lo que terminé haciendo fue registrar un Spring Bean con un método de apagado al que se llama cuando se detiene la aplicación.

Primero, crea una clase de bean, como grails-app/utils/MyShutdownBean.groovy que se parece a lo siguiente (no hay nada sagrado sobre el nombre de la clase o el nombre del método, usa lo que quieras):

class MyShutdownBean { public void cleanup() { // Do cleanup stuff } }

Luego registre el frijol en grails-app/conf/spring/resources.groovy así:

beans = { myShutdownHook(MyShutdownBean) { bean -> bean.destroyMethod=''cleanup'' } }

Si solo quiere hacer la limpieza en producción, puede registrarla así:

beans = { if (!grails.util.GrailsUtil.isDevelopmentEnv()) { myShutdownHook(MyShutdownBean) { bean -> bean.destroyMethod=''cleanup'' } } }


Tienes unas cuantas opciones

Haga que su servicio implemente org.springframework.beans.factory.DisposableBean

class MyService implements org.springframework.beans.factory.DisposableBeam { void destroy() throws Exception { } }

O usa una anotación

class MyService implements org.springframework.beans.factory.DisposableBeam { @PreDestroy public void cleanUp() throws Exception { } }

OMI, la opción de anotación es preferible, ya que puede darle a su método destructor un nombre más significativo que destroy y su API pública de clases no expone la dependencia de Spring


grails-app/conf/BootStrap.groovy se puede usar cuando la aplicación se inicia y se detiene.

def init = { println ''Hello World!'' } def destroy = { println ''Goodnight World!'' }

Nota: Cuando se usa el modo de desarrollo, grails run-app en algunos CTL+C del sistema operativo matará a la JVM sin posibilidad de un cierre limpio y el cierre de la destrucción podría no ser invocado. Además, si tu JVM obtiene el kill -9 el cierre tampoco se ejecutará.