6
votes

Meilleur moyen pour une classe de service Grails pour détecter l'arrêt de l'application?

J'ai une classe de service Grails qui doit faire un peu de nettoyage lorsque mon serveur d'applications Tomcat est arrêté.

Je ne vois rien dans les documents de Grails sur une méthode Service.Stop () ou Détruire () ou un moyen d'implémenter tout type d'auditeur de cycle de vie des applications.

Quelle est la meilleure façon de faire cela?

Merci!


0 commentaires

4 Réponses :


0
votes

Ce n'est pas tout à fait identique à une méthode d'élimination des services, mais ce que j'ai fini par faire est d'enregistrer un haricot de printemps avec une méthode d'arrêt qui est appelée lorsque l'application est arrêtée.

premier, créez une classe de haricots, comme GRAVES-APP / UTILS / MYSHUTODOWNBEAN.GROOVY CODE> On dirait que ce qui suit (il n'y a rien de sacré sur le nom de la classe ou le nom de la méthode, utilisez ce que vous voulez): P>

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


1 commentaires

Comment cela garantit-il qu'il fonctionne lorsque Tomcat meurt? Et si le haricot n'a jamais été instancié? Et si c'était des ordures collectées? Ne serait-il pas alors exécuté votre nettoyage avant de le vouloir?



5
votes

Le grails-app / conf / bootstrap.groovy peut être utilisé lorsque l'application démarre et s'arrête. xxx

Remarque: lorsque vous utilisez le mode de développement GRAILS RUN-APP ON OS CTL + C tuera la JVM sans la chance d'une fermeture propre et de la fermeture destroys ne peut pas être appelée. En outre, si votre JVM obtient le kill -9 la fermeture ne fonctionne pas non plus.


1 commentaires

Cette réponse n'est pas appropriée pour la question, la question demande spécifiquement au service d'être notifiée en cas d'arrêt de l'application. Bien que si seule la nécessité soit de faire quelque chose sur l'arrêt de l'application, c'est assez bon. @ La réponse de Maricel est beaucoup plus proche de la réponse si l'on veut injecter le haricot de service à bootstrap.



7
votes

Vous avez quelques options

Effectuez votre service de service org.springframework.beans.factory.disposablebean xxx

ou utilisez un Annotation xxx

imo, l'option d'annotation est préférable, car vous pouvez donner à votre méthode de destructeur un nom plus significatif que détruire et vos classes API publique 't expose la dépendance du ressort


1 commentaires

Merci, c'est génial! D'accord pour dire que je préfère @predestroy afin de ne pas exposer la dépendance du ressort, et c'est juste beaucoup plus clair ce qui se passe.



1
votes

J'essaierais d'injecter le service dans la bootstrap, puis d'appeler la méthode à partir du bloc Détruisement, car le bloc de destrers est exécuté lorsque l'application est terminée, quelque chose comme ceci:

class BootStrap {

    def myService

    def init = {servletContext ->
    }

    def destroy = {
       myService.cleanUp()
    }
}


1 commentaires

Bon à savoir, Maricel. Bien que dans ce cas, j'aime pouvoir utiliser @predestroy comme Don Suggère parce qu'il lie si proprement et lie simplement le nettoyage du service qui a besoin de nettoyer.