-----Original Message-----
From: Mark Eggers [mailto:its_toas...@yahoo.com] 
Sent: Thursday, April 18, 2013 9:55 PM
To: users@tomcat.apache.org
Subject: Re: Tomcat 7.0 & spring web applcaiton context - Fedora 17

On 4/18/2013 6:35 PM, Khurram Raza wrote:
> Hi,
>
>
>
> After spending days I am writing my problem on this forum. The problem

> is when I undeploy a webapp or shutdown tomcat, spring 
> WebApplicationContext is closed and spring singleton beans destroyed 
> before webapp Servlet's destroy() method is called. This leads me to 
> 'java.lang.IllegalStateException' in Servlet's destroy() method where 
> I am cleaning my resources and destroying dynamically created spring 
> beans and datasources. This happens with tomcat 7.0.39 only on Linux 
> (fedora
> 17) platform. On windows this works perfectly fine on tomcat 7.0.39. I

> have also tried my webapp on tomcat-7.0.29 & tomcat 7.0.25 on linux 
> but the problem persists. I have tried same webapp on tomcat-7.0.29 &
> tomcat-7.0.23 on windows and this work fine without any problem. So I 
> am not sure why it breaks in Linux environment. Here is the log 
> snippet generated on both Linux and Windows:
>
>
>
> Windows (webapp log snippet)
>
> ...
>
> 2013-04-14 20:33:16,510 INFO  [localhost-startStop-2] 
> com.mycompany.servlet.DSServlet - DSServlet|destroy()
>
> 2013-04-14 20:33:16,510 INFO  [localhost-startStop-2] 
> com.mycompany.servlet.DSServlet - Releasing resources...
>
> 2013-04-14 20:33:16,510 DEBUG [localhost-startStop-2] 
> com.mycompany.servlet.DSServlet - Spring application context:
> WebApplicationContext for namespace 'contoller-servlet': startup date 
> [Sun Apr 14 20:32:53 EDT 2013]; root of context hierarchy
>
> 2013-04-14 20:33:16,510 DEBUG [localhost-startStop-2] 
> com.mycompany.servlet.DSServlet - Obtaining 'jdbc_rdb' beans of type 
> DSBean from the spring application context...
>
> 2013-04-14 20:33:16,510 DEBUG [localhost-startStop-2] 
> com.mycompany.servlet.DSServlet - 'jdbc_rdb' beans obtained from the 
> spring application context...
>
> 2013-04-14 20:33:16,510 DEBUG [localhost-startStop-2] 
> com.mycompany.servlet.DSServlet - 'jdbc_rdb' beanName:
> jdbc_rdb_127.0.0.1
>
> 2013-04-14 20:33:16,947 INFO  [localhost-startStop-2] 
> org.springframework.context.support.AbstractApplicationContext - 
> Closing WebApplicationContext for namespace 'contoller-servlet': 
> startup date [Sun Apr 14 20:32:53 EDT 2013]; root of context hierarchy
>
> 2013-04-14 20:33:16,947 DEBUG [localhost-startStop-2] 
> org.springframework.beans.factory.support.AbstractBeanFactory - 
> Returning cached instance of singleton bean 'lifecycleProcessor'
>
> 2013-04-14 20:33:16,947 INFO  [localhost-startStop-2] 
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry

> - Destroying singletons in 
> org.springframework.beans.factory.support.DefaultListableBeanFactory@2
> 4e
> 4af4d: defining beans
> [springApplicationContext,/result.html,org.springframework.web.servlet
> .v iew.InternalResourceViewResolver#0]; root of factory hierarchy
>
>
>
> Linux (webapp log snippet)
>
> ...
>
> 2013-04-13 23:41:08,532 INFO  [localhost-startStop-2] 
> org.springframework.context.support.AbstractApplicationContext - 
> Closing WebApplicationContext for namespace 'controller-servlet': 
> startup date [Sat Apr 13 23:39:28 EDT 2013]; root of context hierarchy
>
> 2013-04-13 23:41:08,535 DEBUG [localhost-startStop-2] 
> org.springframework.beans.factory.support.AbstractBeanFactory - 
> Returning cached instance of singleton bean 'lifecycleProcessor'
>
> 2013-04-13 23:41:08,536 INFO  [localhost-startStop-2] 
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry

> - Destroying singletons in
> org.springframework.beans.factory.support.DefaultListableBeanFactory@2
> 43
> 84979: defining beans
> [springApplicationContext,/result.html,org.springframework.web.servlet
> .v
> iew.InternalResourceViewResolver#0,jdbc_rdb_127.0.0.1,jdbc_rdb_192.168
> .0
> .31]; root of factory hierarchy
>
> 2013-04-13 23:41:08,537 INFO  [localhost-startStop-2] 
> com.mycompany.servlet.DSServlet - -> DSServlet|destroy()
>
> 2013-04-13 23:41:08,544 INFO  [localhost-startStop-2] 
> com.mycompany.servlet.DSServlet - -> Releasing resources...
>
> 2013-04-13 23:41:08,545 DEBUG [localhost-startStop-2] 
> com.mycompany.servlet.DSServlet - -> Spring application context:
> WebApplicationContext for namespace 'controller-servlet': startup date

> [Sat Apr 13 23:39:28 EDT 2013]; root of context hierarchy
>
> 2013-04-13 23:41:08,546 DEBUG [localhost-startStop-2] 
> com.mycompany.servlet.DSServlet - -> Obtaining 'jdbc_rdb' beans of 
> type DSBean from the spring application context...
>
> 2013-04-13 23:41:08,577 ERROR [localhost-startStop-2] 
> com.mycompany.servlet.DSServlet - Unable to releaase resources.
>
> java.lang.IllegalStateException: BeanFactory not initialized or 
> already closed - call 'refresh' before accessing beans via the 
> ApplicationContext
>
>        at
> org.springframework.context.support.AbstractRefreshableApplicationCont
> ex
> t.getBeanFactory(AbstractRefreshableApplicationContext.java:172)
> ~[spring-context-3.2.0.RELEASE.jar:3.2.0.RELEASE]
>
>        at
> org.springframework.context.support.AbstractApplicationContext.getBean
> Na
> mesForType(AbstractApplicationContext.java:1174)
> ~[spring-context-3.2.0.RELEASE.jar:3.2.0.RELEASE]
>
>        at com.mycompany.servlet.DSServlet.destroy(DSServlet.java:120)
> ~[relaism-db-0.1.0.jar:na]
>
>        at
> org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1
> 48
> 1) [catalina.jar:7.0.39]
>
>        at
> org.apache.catalina.core.StandardWrapper.stopInternal(StandardWrapper.
> ja
> va:1842) [catalina.jar:7.0.39]
>
>        at
> org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
> [catalina.jar:7.0.39]
>
>        at
> org.apache.catalina.core.StandardContext.stopInternal(StandardContext.
> ja
> va:5561) [catalina.jar:7.0.39]
>
>        at
> org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
> [catalina.jar:7.0.39]
>
>        at
> org.apache.catalina.core.ContainerBase$StopChild.call(ContainerBase.ja
> va
> :1575) [catalina.jar:7.0.39]
>
>        at
> org.apache.catalina.core.ContainerBase$StopChild.call(ContainerBase.ja
> va
> :1564) [catalina.jar:7.0.39]
>
>        at
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> [na:1.7.0_17]
>
>        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> [na:1.7.0_17]
>
>        at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.j
> av
> a:1145) [na:1.7.0_17]
>
>        at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.
> ja
> va:615) [na:1.7.0_17]
>
>        at java.lang.Thread.run(Thread.java:722) [na:1.7.0_17]
>
>
>
> Comparing highlighted portion clearly shows that in windows 
> environment,
> DSSerlet.destroy() method is called, resources are cleaned, spring web

> application context is closed and spring singleton beans are
destroyed.
> However, as depicted in Linux log snippet, it is vice versa.
>
>
>
> Although the webapp works perfectly fine as this problem happens when 
> webapp is updepolyed or tomcat is shutdown but still I cannot ignore 
> this because the datasources are still running and needs to be 
> destroyed to avoid memory leaks before undeploying webapp.
>
>
>
> I will very much appreciate if I can get any help in finding a 
> solution to this problem.
>
>
>
> Thanks in advance.
>
>
>
> - Raza.
>
>

Do your initialization and shutdown in a ServletContextListener? They
are guaranteed to be run in the order listed in web.xml on context
startup and in the reverse order on context shutdown.

First of all thanks for replying. I am not using ServletContextListener
instead I have <servlet> defined in my web.xml as 'DSServlet' which
extends HttpServlet. So this follows a servlet life cycle which is
init(), service(), destroy() method in this sequence. I have init() and
destroy() method defined in 'DSServlet' which executes on when Servlet
is initialized and destroyed respectively. Here is my web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd";>

  <display-name>dstest</display-name>
  
   <servlet>
        <servlet-name>contoller</servlet-name>
        
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servle
t-class>
        <init-param>
                <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/SPRING-CONFIG/DS-CONFIG.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>    
  </servlet>
  
  <servlet>
        <servlet-name>dsServlet</servlet-name>
        <servlet-class>com.mycompany.servlet.DSServlet</servlet-class>
        <init-param>
                <param-name>contextConfigLocation</param-name>
 
<param-value>/WEB-INF/SPRING-CONFIG/DS-DEFINITION-CONFIG.xml</param-valu
e>
        </init-param>
        <load-on-startup>2</load-on-startup>    
  </servlet>
  
  <servlet-mapping>
        <servlet-name>contoller</servlet-name>
        <url-pattern>*.html</url-pattern>
  </servlet-mapping>
  
</web-app>

Another thought - is there a reason why you're not using a JNDI -
addressable connection pool?
Yes there is a reason, we have database config defined elsewhere and not
inside tomcat environment. The application reads database config and
creates data sources.

. . . just my (probably wrong) two cents.
/mde/
Didn't get that, what is this?

Any other suggestions on my problem are welcome and will be appreciated.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to