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á.