tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Craig R. McClanahan" <craig...@apache.org>
Subject Re: Urgent problem with Singleton
Date Fri, 10 Jan 2003 01:49:29 GMT


On Fri, 10 Jan 2003, David Hemingway wrote:

> Date: Fri, 10 Jan 2003 11:49:35 +1100
> From: David Hemingway <dbh001@kooee.com.au>
> Reply-To: Tomcat Users List <tomcat-user@jakarta.apache.org>
> To: Tomcat Users List <tomcat-user@jakarta.apache.org>
> 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:tomcat-user-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:tomcat-user-help@jakarta.apache.org>


Mime
View raw message