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 >
signature.asc
Description: OpenPGP digital signature