当前位置: 首页 > 知识库问答 >
问题:

当我的tomcat关闭时,spring bean的destroy-method没有被调用

楚嘉玉
2023-03-14

我无法找到在tomcat停止的情况下,当我的应用程序关闭时,销毁方法没有被调用的原因。

我有一个web应用程序,通过web.xml中的ContextLoaderListener加载spring上下文,如下所示:

web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:appContext.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

下面是我的应用程序中的员工bean:

Employee.class

public class Employee {
    String eName;
    long eSal;
    public String getEName() {
        return eName;
    }
    public void setEName(String name) {
        eName = name;
    }
    public long getESal() {
        return eSal;
    }
    public void setESal(long sal) {
        eSal = sal;
    }

    public void init() {
        System.out.println("Initiaizing...");
        System.out.println("eName: " + eName + " - eSal: " + eSal);
    }

    public void close() {
        System.out.println("Destroying...");
    }
}

bean在我的应用程序上下文文件中定义如下:

appContext.xml

<beans:beans xmlns="http://www.springframework.org/schema/integration"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <beans:bean id="employee" class="com.test.Employee" init-method="init" destroy-method="close">
        <beans:property name="eName" value="sandip" />
        <beans:property name="eSal" value="80000" />
    </beans:bean>        
</beans:beans>

Tomcat控制台日志:

May 12, 2014 11:28:46 AM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre6\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files\Java\jre7\bin\client;C:\Program Files\Java\jre7\bin;C:\Program Files\Common Files\NetSarang;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Lenovo\Access Connections\;D:\Project\maven-2.0.7\bin;D:\Software Backup\apache-ant-1.7.0\bin;C:\Program Files\Java\jdk1.6.0_20\bin;D:\Project\OBD3\1.5;D:\Software Backup\CVS;D:\Project\UNIX\UnxUtils\usr\local\wbin;C:\Program Files\QuickTime\QTSystem\;D:\Personal\MongoDB\MongoDB_work\mongodb\bin;D:\Software Installed\MariaDB 5.5\bin;C:\Program Files\Git\bin
May 12, 2014 11:28:46 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:testSpringBeanDestroy' did not find a matching property.
May 12, 2014 11:28:46 AM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8093
May 12, 2014 11:28:46 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 419 ms
May 12, 2014 11:28:46 AM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
May 12, 2014 11:28:46 AM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.32
May 12, 2014 11:28:46 AM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(D:\Project\Workspace_new\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\testSpringBeanDestroy\WEB-INF\lib\servlet.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
May 12, 2014 11:28:46 AM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
Initiaizing...
eName: sandip - eSal: 80000
May 12, 2014 11:28:47 AM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8093
May 12, 2014 11:28:47 AM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8011
May 12, 2014 11:28:47 AM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/20  config=null
May 12, 2014 11:28:47 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 768 ms

当我启动我的tomcat时,我可以看到我的init方法正在被调用,但不幸的是,当我停止tomcat时,关闭()即没有调用销毁方法。

我正在使用Spring3.1.2版本的JAR。

我做错了什么?

共有1个答案

夏俊杰
2023-03-14

谢谢安德烈。1给你。问题是我没有正常关机。现在,在阅读了一些文档之后,我发现如果我从tomcat管理器或使用关闭脚本(shutdwon.sh/shutdown.bat)优雅地关闭tomcat,就会调用我的destroy方法。

Kill -9命令将不起作用,如果试图从eclipse中停止,它也不起作用。

 类似资料:
  • 嗨,我为AWT窗口创建了这个java代码 当我按下X按钮试图关闭窗户时,什么也没发生。窗户一直开着。我对示例代码做了以下更改:公共类labelExample extends Frame implements ActionListener{ 我添加了新的awt-frame f,名称为“Label example”。 Frame f;Frame f=新框架(“Label example”);并添加了此

  • 问题内容: 我一直在对我们的一个宠物项目进行代码审查(通常使用诸如FindBugs之类的工具),并且FindBugs将以下代码标记为错误的(伪代码): 错误是此代码可能不会释放资源。我发现ResultSet和Statement没有关闭,所以我最终将它们关闭: 但是我在许多项目(来自许多公司)中遇到了上述模式,没有人关闭ResultSets或Statements。 关闭连接时,是否关闭了Result

  • 问题内容: } 我已经为按键设置了监听器。每当我按下按键时,为什么框架没有关闭? 问题答案: 调用 不会关闭框架,它将定义按下Windows装饰[X]关闭按钮时的行为(已禁用全屏显示)。您可以将其替换为或退出程序。

  • 问题内容: 我在告诉Android 方向更改时不打电话时遇到了麻烦。我已添加到清单中,但仍在调用方向更改时添加。这是我的代码。 AndroidManifest.xml SearchMenuActivity.java 还有我的LogCat输出 有人知道我在做什么错吗?谢谢。 问题答案: 要尝试的几件事: 而不是 确保您没有在任何地方打电话。这将导致onConfigurationChange()无法触

  • 我做了一个jsf应用程序。这个应用程序有一个包含开始、停止按钮的菜单。当按下开始时,应用程序开始从网站获取数据,并更新其数据库。应用程序还有更新过程的进度条。但是,这个过程需要很长时间才能完成。我希望当我关闭浏览器时,它应该继续更新数据库。此外,当我再次打开它时,我应该得到以前的状态。然而,这并没有发生。当我关闭浏览器时,应用程序也关闭了。我该怎么办? 谢谢。