如何知道何时取消部署JavaEE应用程序?

如何知道何时取消部署JavaEE应用程序?,java,deployment,jakarta-ee,stream,Java,Deployment,Jakarta Ee,Stream,在取消部署Java EE应用程序时,我需要关闭一些流,以避免每次取消部署时server.log中出现异常页面。例外情况是:“输入流已完成或强制关闭,但未显式关闭”。我知道如何关闭(使用close()方法),但不知道何时关闭 finallize()来得太晚了,@PreDestroy不仅在取消部署之前被调用,而且在正常操作模式下也被调用。应用程序如何知道何时取消部署 编辑: 我在创建过程中称之为: decisionLogger = KnowledgeRuntimeLoggerFactory.

在取消部署Java EE应用程序时,我需要关闭一些流,以避免每次取消部署时server.log中出现异常页面。例外情况是:“输入流已完成或强制关闭,但未显式关闭”。我知道如何关闭(使用close()方法),但不知道何时关闭

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

编辑: 我在创建过程中称之为:

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

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

没有确切的答案,因为JavaEE包含了很多生命周期不同的技术


但我想暗中试探一下,建议你看看。这将告诉您web应用程序何时停止,这可能是您希望释放资源的时间-而不是在应用程序卸载时。

将finalize()方法添加到记录器或导致问题的任何类。把小溪从那堵上。除非使用System.exit()退出,否则它将运行。如果调用System.exit,您可以使用Runtime.addShutdownHook

不幸的是,此应用程序中没有web模块。这只是纯粹的业务逻辑。一个JMS主题作为输入,一个规则引擎和一个邮件服务器作为输出。甚至有更多的理由包括良好的日志功能,但这正是引发异常的地方。当记录器在取消部署过程中被销毁时。您能否以某种方式连接到正在使用的应用程序服务器的取消部署功能?我不确定应用程序是否可以知道它是否已被取消部署。您还可以尝试吞咽流在代码中使用流时抛出的异常。您如何连接到那里的取消部署功能?接受异常不是一个选项,因为我无法访问抛出异常的线程。它隐藏在Drools实现中。我使用Drools运行时的记录器。我不能改变它,也不能对它进行子类化,因为我从Drools运行时的一个工厂获得它。并且在使用它的对象的finalize方法中关闭它来的太晚了。我还是有例外,看看。它提供了你能做的基本知识。创建一个注册到Runtime.addShutDownHook的方法,这样当运行时停止时它就会执行。我尝试了这个方法,发现它在JEE环境中不起作用,因为当应用程序取消部署时JVM不会关闭。当我解除部署时,关闭钩从未被调用。我找到了另一个可能的答案。它与McDowell所说的servlet上下文侦听器有关。drools运行时仍然有一个web.xml,您需要对其进行编辑,以便向其中添加新的上下文侦听器。