I'm building a relatively simple web-app where the main servlet implements the ServletContextListener
interface to determine whether the context has been started or stopped. I've implemented my contextInitialized
, contextDestroyed
, init
and destroy
methods (both init
and destroy
call super
on the base class). I've currently implemented no real functionality other than that I've initialized log4j in the contextInitialized
method where I load the log4j.properties
file.
When I start and stop the Tomcat server from within Eclipse however, everything is called in the correct order (I'm using some System.out.println
's to test this) but after about 10 seconds of stopping the server I'm presented with an Eclipse popup stating the following:
Server Tomcat v6.0 Server at localhost is not responding. Do you want to terminate this server? Click OK to terminate the server or click Cancel to continue waiting.
This is what's printed in my Eclipse console when I stop the server:
04/01/2010 7:39:13 PM org.apache.catalina.core.StandardService stop
INFO: Stopping service Catalina
contextDestroyed
04/01/2010 7:39:13 PM org.apache.coyote.http11.Http11Protocol destroy
INFO: Stopping Coyote HTTP/1.1 on http-8080
And after the last INFO
message it just hangs there until the popup appears. If I choose to wait, press Cancel, Eclipse becomes unusable and I have to kill the Eclipse process from a terminal.
Any input on how to solve this issue would be greatly appreciated.
UPDATE:
The problem was caused by a non-daemon thread that I'm starting within my init
method (forgot to mention that :). The problem was solved by explicitly stopping the thread with the stop
method, even though that method seems to be deprecated.
More specifically, looking at the Eclipse plugin code at https://github.com/eclipse/webtools.servertools/blob/master/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatServerBehaviour.java around line 540 (look for the comment "//ping server for startup") I see that ...
As mentioned in this thread, this should be related to a cleanup issue.
If a webapp doesn't cleanup completely, especially with respect to stopping non-daemon threads it starts, Tomcat will fail to shutdown.
Clicking "Stop" has the advantage of providing a timeout.
If Tomcat fails to stop within the timeout, a dialog will appear giving you the option to terminate the server or continue waiting.
Open Command Prompt or PowerShell in windows and type
netstat -nao
find pid of corresponding port from the result and type
taskkill /f /pid [port number]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With