1. Is Tomcat's behavior on this point user-configurable (and if so
2. If it's not, I'd appreciate any pointers to information about
exactly how Tomcat handles this.
[...On re-reading this passage from the servlets spec, I realize that
"any threads that are currently running in the service method" is murky
me. Is this supposed to be more restrictive than "any threads that have
ever been started by the servlet instance (including during init()) and
that are still running"?]
Yes, it's supposed to be much more restrictive. Any threads in the
service() methods means exactly that, and nothing more. If you start
any threads during init(), destroy(), or wherever (including service())
for that matter, you are responsible for their shutdown on system
shutdown. Typically the simplest way to avoid problems here is to mark
these threads as daemons. There are other solutions should you need
The JVM will not exit if there are any user non-daemon threads running.
The JavaDoc for the java.lang.Thread class is pretty clear on this
point. You have to have an explicit System.exit() call in your code to
handle that case, which of course is hazardous in other ways.
Alternatively, have some sort of a singleton start all your threads and
on shutdown let the singleton know to stop/kill them all. One possible
place to do this (that's much better for this purpose than a servlet's
destroy() method is a ServletContextListener's contextDestroyed() event.
Tomcat handles this in a strictly standards-compliant (which is not to
say ideal, but which I actually like) way. Tomcat will exit, i.e. stop
listening on that port and stop its own threads, properly. However, the
JVM itself will keep running. You will not be able to start another
tomcat on the same port (you'll get a BindException, Address Already In
Use). So this is one situation you want to avoid.
To unsubscribe, e-mail: <mailto:tomc...@jakarta.apache.org>
For additional commands, e-mail: <mailto:tomc...@jakarta.apache.org>