我如何知道何时取消部署Java EE应用程序?

我取消部署Java EE应用程序时需要关闭一些流,以避免每次取消部署时在server.log中出现exception页面。 例外说:“输入流已经完成或强制关闭而未明确关闭”。 我知道如何关闭(使用close()方法),但我不知道什么时候。

finallize()来得太晚,@ PreDestroy不仅在取消部署之前被调用,而且在正常操作模式下也被调用。 应用程序在取消部署时如何知道?

编辑:我在创作过程中调用它:

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

decisionLogger的类型为KnowledgeRuntimeLogger,它只有close()方法。 在引擎盖下工作的线程没有吸气剂。 要轻轻关闭它,我需要调用close方法,但什么时候?

将finalize()方法添加到记录器或导致问题的任何类。 从中关闭流。 除非您使用System.exit()退出,否则它将运行。 如果正在调用System.exit,则可以使用Runtime.addShutdownHook

没有硬性和快速的答案,因为Java EE包含许多具有不同生命周期的技术。

但是我将在黑暗中采取刺激并建议你看看ServletContextListener 。 这将告诉您何时停止Web应用程序,这可能是您要释放资源的时间 – 而不是应用程序卸载。