Craig,

As well as synchronizing that block and setting reloadable="false" in the
server.xml I paid close attention to when these extra instances are being
created. When the server start and no requests have been received there is
only the 1 instance. However as soon as a single request is made another 2
instances appear. From then on no more get created. I am not modifying code
on the fly either. Any other ideas?

regards,
Dave


----- Original Message -----
From: "Craig R. McClanahan" <[EMAIL PROTECTED]>
To: "Tomcat Users List" <[EMAIL PROTECTED]>
Sent: Friday, January 10, 2003 12:49 PM
Subject: Re: Urgent problem with Singleton


>
>
> On Fri, 10 Jan 2003, David Hemingway wrote:
>
> > Date: Fri, 10 Jan 2003 11:49:35 +1100
> > From: David Hemingway <[EMAIL PROTECTED]>
> > Reply-To: Tomcat Users List <[EMAIL PROTECTED]>
> > To: Tomcat Users List <[EMAIL PROTECTED]>
> > Subject: Urgent problem with Singleton
> >
> > Hi,
> >
> > I have a task scheduler thread that implements ServletContextListener
and starts up as a listener with the following code from my web.xml:
> >
> > <listener>
> >         <listener-class>
> >                 mypackage.MyServlet
> >         </listener-class>
> > </listener>
> >
> > My problem is however I need this to be a singleton, its imperative.
> > There always seems to be about 3 threads created though.
>
> The number of threads that Tomcat creates is *totally* independent of the
> number of listener instances that are created.
>
> > I have tried
> > numerous things including making this servlet call a singleton class to
> > do the task scheduling but it still ends up with 3 threads. This is
> > causing terrible concurrency problems that wouldn't exist if this was
> > working properly. My serlvet code currently resembles the following:
> >
> > boolean hasBeenInitialized = false;
> >
> >  public void contextInitialized(ServletContextEvent sce)
> >  {
> >     if(!hasBeenInitialized)
> >     {
> >         //Start up the task scheduler thread
> >         hasBeenInitialized = true;
> >     }
> > }
> >
> >
> > I am using Tomcat 4.1.18, Apache 1.3.27 under RedHat 7.3. I didn't have
> > this problem under wn32 only Linux. Any help, or ideas on how I can get
> > this to be a single instance would be greatly appreciated. Thank you
> >
>
> At webapp startup time, Tomcat is supposed to create one and only one
> instance of each declared listener, and call its appropriate init method
> (contextInitialized() in your case).  However, there's a bug in 4.1.18
> (and earlier 4.1.x releases) where, if you are using Tomcat's auto-reload
> facility, the list of listeners doesn't get cleared so a new instance of
> the listener gets added each time you reload the app.
>
> This will be fixed in 4.1.19 -- in the mean time, be sure that you avoid
> Tomcat's auto-reload facilities if you depend on the listeners being
> singletons.
>
> A class that implements ServletContextListener should *not* itself be a
> Servlet, by the way.  The only purpose for such a class should be to
> initialize resources that your webapp needs, not to also respond to
> requests.
>
>
> > regards,
> > Dave
> >
> >
>
> Craig
>
>
>
> --
> To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
>


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to