2010-07-23 14 views
2

Je dois fermer certains flux lorsque mon application Java EE n'est pas déployée pour éviter des pages d'exceptions dans le fichier server.log chaque fois que je ne les déploie pas. Les exceptions disent: "Le flux d'entrée a été finalisé ou forcé fermé sans être explicitement fermé". Je sais comment fermer (avec la méthode close()), mais je ne sais pas quand. Finallize() arrive trop tard, @PreDestroy est appelé non seulement avant le déploiement, mais aussi en mode de fonctionnement normal. Comment l'application sait-elle quand elle n'est pas déployée?Comment puis-je savoir quand une application Java EE n'est pas déployée?

Edit: J'appelle cela lors de la création:

decisionLogger = KnowledgeRuntimeLoggerFactory.newThreadedFileLogger(
    ksession, 
    config.getString("rules.logfilename"), 
    config.getInt("rules.loginterval")); 

decisionLogger est de type KnowledgeRuntimeLogger qui n'a que la méthode close(). Pas de getter pour le fil qui fonctionne sous le capot. Pour l'éteindre doucement, je dois appeler la méthode proche, mais quand?

+0

pouvez-vous vous connecter à la fonctionnalité de déploiement du serveur d'applications que vous utilisez d'une manière ou d'une autre? Je ne suis pas sûr qu'une application peut savoir si elle n'a pas été déployée. Vous pouvez également essayer d'avaler les exceptions que les flux lancent lorsque vous utilisez les flux dans le code. –

+0

J'utilise Glassfish 2.1. Comment pouvez-vous accrocher dans la fonctionnalité undeploy là? Avaler les exceptions n'est pas une option, parce que je n'ai pas accès au thread qui les lance. Il est caché dans l'implémentation de Drools. – Arne

Répondre

2

Ajoutez une méthode finalize() au consignateur ou à la classe qui provoque les problèmes. Fermez les flux de cela. Sauf si vous quittez avec System.exit(), il s'exécutera. Si System.exit est appelé, vous pouvez utiliser Runtime.addShutdownHook

+0

J'utilise un enregistreur de l'exécution de Drools. Je ne peux pas changer cela et je ne peux pas le sous-classer parce que je l'obtiens aussi d'une usine qui fait partie de l'exécution de Drools. Et le fermer dans la méthode finalize de l'objet qui l'utilise vient trop tard. Je reçois toujours les exceptions alors. – Arne

+0

regardez http://www.mckoi.com/database/maillist/msg00374.html. Il obtient les bases de ce que vous pourriez faire. Créez une méthode qui s'enregistre avec Runtime.addShutDownHook et ainsi, lorsque le runtime s'arrêtera, il s'exécutera. –

+0

J'ai essayé cela et j'ai constaté que cela ne fonctionnait pas dans un environnement JEE, puisque la JVM n'est pas arrêtée lorsque l'application n'est pas déployée. Le ShutdownHook n'est jamais appelé lorsque je ne le déploie pas. – Arne

3

Il n'y a pas de réponses concrètes car Java EE englobe beaucoup de technologies avec des cycles de vie variés.

Mais je vais prendre un coup dans le noir et vous suggérons de regarder ServletContextListener. Cela vous indiquera quand votre application web est arrêtée, ce qui est probablement le moment où vous voulez libérer des ressources - pas sur la désinstallation de l'application.

+0

Malheureusement, je n'ai pas de module web dans cette application. C'est juste de la pure logique commerciale. Une rubrique JMS en entrée, un moteur de règles et un serveur de messagerie en sortie. Encore plus de raisons d'inclure de bonnes capacités de journalisation, mais c'est exactement là que les exceptions sont lancées. Lorsque l'enregistreur est détruit pendant le déploiement. – Arne