2014-05-12 16 views
5

Non riesco a trovare la causa per cui il mio destroy-method non viene chiamato quando la mia applicazione si spegne in caso di arresto del tomcat.destroy-method of spring bean non viene chiamato quando il mio tomcat si spegne

Ho un'applicazione web e il contesto della molla è sempre caricato attraverso ContextLoaderListener in web.xml come di seguito:

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> 

sotto è un fagiolo dei dipendenti nella mia applicazione:

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..."); 
    } 
} 

e il fagiolo è definita nel mio file contesto di applicazione come di seguito:

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 log della console:

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 

Quando avvio il mio gatto mi posso vedere che il mio metodo init viene chiamato ma sfortunatamente quando interrompo il tomcat il close() cioè il metodo destroy non viene chiamato.

Sto usando i vasi di distribuzione di primavera 3.1.2.

Cosa sto sbagliando?

+0

Come si ferma Tomcat? –

+0

basta uccidere il processo o utilizzare shutdown.sh – Sandy

+2

E si ottiene lo stesso comportamento sia con kill che shutdown.sh? Avrei pensato che solo l'uccisione non funzionerà come previsto. –

risposta

0

Grazie Andrei. +1 per te. Il problema era che non stavo chiudendo correttamente. Ora, dopo aver letto alcuni documenti, ho scoperto che se chiudo il mio tomcat con garbo dal Tomcat Manager o usando gli script di shutdown come (shutdwon.sh/shutdown.bat), viene chiamato il metodo My destroy.

Il comando Kill -9 non funziona e anche se si tenta di fermarsi da eclissi, non funziona.

+0

Sono in una situazione simile. Voglio che il metodo 'destroy()' di Servlet sia innescato ed essere in grado di eseguire il completamento, quando il servizio Tomcat7 viene arrestato ('service tomcat7 stop'), ma non posso dire se questo è l'approccio giusto. Dove puoi trovare gli script di spegnimento? ('Shutdown.sh/shutdown.bat')? Dovrebbe 'service tomcat7 stop' essere equivalente o non chiamerà' destroy() ' – mmcrae

+0

voleva attirare la tua attenzione specificatamente @Sandy – mmcrae

Problemi correlati