On 26/05/2010 19:43, devn...@web.de wrote:
> 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;
>        }

Why mix & match the Servlet and ServletContextListener methods?


p

>        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
> 


Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to