取消部署Java EE应用程序时,我需要关闭一些流,以避免每次取消部署server.log中的异常页面。例外说明:“输入流已完成确定或被强制关闭而未明确关闭”。我知道如何关闭(使用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应用程序,这可能是您要释放资源的时间-而不是在应用程序卸载时。