J'ai une classe de service Grails qui doit faire un peu de nettoyage lorsque mon serveur d'applications Tomcat est arrêté. P>
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. P>
Quelle est la meilleure façon de faire cela? P>
Merci! P>
4 Réponses :
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' } } }
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?
Le Remarque: lorsque vous utilisez le mode de développement grails-app / conf / bootstrap.groovy code> peut être utilisé lorsque l'application démarre et s'arrête.
GRAILS RUN-APP CODE> ON OS
CTL + C CODE> 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 code> la fermeture ne fonctionne pas non plus. P> p>
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.
Vous avez quelques options
Effectuez votre service de service ou utilisez un Annotation p> imo, l'option d'annotation est préférable, car vous pouvez donner à votre méthode de destructeur un nom plus significatif que org.springframework.beans.factory.disposablebean code> p>
détruire code> et vos classes API publique 't expose la dépendance du ressort p> p>
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.
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() } }
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.