Hi,

Thanks for reading this.

I am developing a webapp and do not understand the following:
In my app, I create a Timer when the servlet starts.
When tomcat stops, I try to stop the timer in order to avoid memory leaks.

My question is: why do I get a NullPointerException while trying to access 
mytimer in contextDestroyed().

The simplified code:

public class myclass extends HttpServlet implements ServletContextListener {

       java.util.Timer mytimer;
       int testint;

       public void init() throws ServletException {
               mytimer = new Timer("__test__");
              TimerTask taskPerformer = new TimerTask() { public void run() { 
whatever_function(); } };
               mytimer.scheduleAtFixedRate(taskPerformer, 10, 10, 864000);
              testint = 12;
       }

       public void contextDestroyed(ServletContextEvent event) {
              System.out.println("Inside contextDestroyed, testint="+testint);
              try {
                     mytimer.cancel();
              }
              catch (Exception e) {
                     System.out.println("An error occurred inside 
contextDestroyed(): "+e);
              }
}

       public void contextInitialized(ServletContextEvent event) {
              // Nothing here
       }

       public void destroy() {
             // Nothing here
       }
}

The Output:
May 26, 2010 8:06:30 PM org.apache.catalina.core.StandardService stop
INFO: Stopping service Catalina
Inside contextDestroyed(), testing=12
An error occurred inside contextDestroyed(): java.lang.NullPointerException
May 26, 2010 8:06:30 PM org.apache.catalina.loader.WebappClassLoader 
clearReferencesThreads
SEVERE: A web application appears to have started a thread named [__test__] but 
has failed to stop it. This is very likely to create a memory leak.

What disturbs me, is that my other variable "testint" is accessible within 
contextDestroyed, but not mytimer.

If I save my timer in init() like this:

      ServletContext sc = getServletContext();
     sc.setAttribute("mytimer", mytimer)

and if I modify contextDestroyed() so that it accesses my timer through 
ServletContext

     ServletContext context = event.getServletContext();
     Timer mytimer2 = (Timer)context.getAttribute("mytimer");

then I have no problem stopping it, making the tomcat warning disappear.
I'd like to understand why it is so.

Thank you very much in advance
___________________________________________________________
NEU: WEB.DE DSL für 19,99 EUR/mtl. und ohne Mindest-Laufzeit!
http://produkte.web.de/go/02/

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

Reply via email to