【问题标题】:Spring bean not destroyed while redeploying app in tomcat在tomcat中重新部署应用程序时Spring bean没有被破坏
【发布时间】:2017-09-01 14:55:04
【问题描述】:

我有一个在 tomcat 9 上部署的 webapp。作为部署的一部分,我们只是将战争放到 webapps 目录,然后 tomcat 重新部署战争。但是有时候我们会在日志中看到一些错误,基本上是一些spring bean的destroy方法没有被调用:

2017 年 8 月 31 日 21:41:35.292 信息 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.undeploy 取消部署上下文 [/globalsearch] 信息:org.springframework.web.context.support.XmlWebApplicationContext - 关闭命名空间“appServlet-servlet”的 WebApplicationContext:启动日期 [2017 年 8 月 30 日星期三 22:34:34 AEST];父级:根 WebApplicationContext 信息:org.springframework.web.context.support.XmlWebApplicationContext - 关闭根 WebApplicationContext:启动日期 [2017 年 8 月 30 日星期三 22:34:26 AEST];上下文层次的根 警告:org.springframework.beans.factory.support.DisposableBeanAdapter - 在名为“GlobalSearchEventLoadMessageProcessing”的bean上调用销毁方法“cleanUp”失败:java.lang.IllegalStateException:java.io.FileNotFoundException:/opt/tomcat/9.0.0 .M19/webapps/globalsearch/WEB-INF/lib/commons-collections-3.2.1.jar(没有这样的文件或目录) 警告:org.springframework.beans.factory.support.DisposableBeanAdapter - 在名为“globalSearchMessageSender”的bean上调用销毁方法“cleanUp”失败:java.lang.IllegalStateException:java.io.FileNotFoundException:/opt/tomcat/9.0.0 .M19/webapps/globalsearch/WEB-INF/lib/commons-collections-3.2.1.jar(没有这样的文件或目录) 警告:org.springframework.beans.factory.support.DisposableBeanAdapter - 在名为“globalSearchEmbeddedJMS”的bean上调用销毁方法“stopServer”失败:java.lang.IllegalStateException:java.io.FileNotFoundException:/opt/tomcat/9.0.0 .M19/webapps/globalsearch/WEB-INF/lib/commons-collections-3.2.1.jar(没有这样的文件或目录) 警告:org.springframework.beans.factory.support.DisposableBeanAdapter - 在名为“connectionFactory”的bean上调用销毁方法“close”失败:java.lang.IllegalStateException:java.io.FileNotFoundException:/opt/tomcat/9.0.0 .M19/webapps/globalsearch/WEB-INF/lib/commons-collections-3.2.1.jar(没有这样的文件或目录)

spring bean 正在创建一个线程,该线程正在销毁方法中被销毁,并且由于错误,即使重新部署后该线程仍然处于活动状态。

我正在为 spring 配置使用 xml 文件:

<bean id="GlobalSearchEventLoadMessageProcessing"
    class="xxx.GlobalSearchEventLoadMessageProcessing"
    init-method="initialize" destroy-method="cleanUp">
</bean>

如何保证destroy方法被调用和执行完。 我正在使用 Java 8、Tomcat 9 和 Spring 4.1.9

PS:我无法停止和启动服务器以进行部署过程。

【问题讨论】:

    标签: java spring tomcat


    【解决方案1】:

    查看错误,调用了方法WAS:

    WARN : org.springframework.beans.factory.support.DisposableBeanAdapter - Invocation of destroy method 'cleanUp' failed on bean with name 'GlobalSearchEventLoadMessageProcessing': java.lang.IllegalStateException: java.io.FileNotFoundException: /opt/tomcat/9.0.0.M19/webapps/globalsearch/WEB-INF/lib/commons-collections-3.2.1.jar (No such file or directory)
    

    但它失败了,因为很可能是由于竞争条件 - 您试图从已从容器中删除的 jar 文件中运行一些代码。你能避免在cleanup 方法中使用外部库吗?

    【讨论】:

    • 感谢您的回复...实际上在清理方法中,Executor 服务正在关闭并且 JMSContext 正在关闭,这可能在内部使用这些 3rd 方 jars....我认为我无法避免这种情况...还有其他建议吗?
    • 它可能与您正在使用的 JMSContext 有关,因为我相信这是一个间接调用,Java / Tomcat 不会“看到”不同线程中的依赖关系并允许从内存中删除 JAR在代码完成执行之前。您可以尝试更改代码以明确使用您的依赖项。
    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2013-03-04
    • 2019-08-16
    相关资源
    最近更新 更多