[jetty-user] Stopping programatically causes “1 threads could not be stopped”

Ondřej Žižka <[email protected]>
Newsgroups gmane.comp.java.jetty.support
Message-ID <1294688862.9209.35.camel@ondra-redhat>
Hi,

this is a copy of
http://stackoverflow.com/questions/4650713/jetty-stopping-programatically-causes-1-threads-could-not-be-stopped .
I'm sending here to bring some attention to it.


I have a Jetty 6.1.26 instance.
I want to shut it down by HTTP GET sent to `/shutdown`.
So I created a `JettyShutdownServlet`:

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse
resp) throws ServletException, IOException {

     resp.setStatus(202, "Shutting down.");
     resp.setContentType("text/plain");
     ServletOutputStream os = resp.getOutputStream();
     os.println("Shutting down.");
     os.close();
     resp.flushBuffer();
   
     // Stop the server.
     try {
        log.info("Shutting down the server...");
        server.stop();
     } catch (Exception ex) {
        log.error("Error when stopping Jetty server: "+ex.getMessage(),
ex);
     }

However, when I send the request, Jetty does not stop - a thread keeps
hanging in `QueuedThreadPool` on the line with `this.wait()`:

       // We are idle
       // wait for a dispatched job
       synchronized (this)
       {
           if (_job==null)
              this.wait(getMaxIdleTimeMs());
           job=_job;
           _job=null;
       }

...

    2011-01-10 20:14:20,375 INFO  org.mortbay.log jetty-6.1.26
    2011-01-10 20:14:34,756 INFO  org.mortbay.log Started
[email protected]:17283
    2011-01-10 20:25:40,006 INFO  org.jboss.qa.mavenhoe.MavenHoeApp
Shutting down the server...
    2011-01-10 20:25:40,006 INFO  org.mortbay.log Graceful shutdown
[email protected]:17283
    2011-01-10 20:25:40,006 INFO  org.mortbay.log Graceful shutdown
org.mortbay.jetty.servlet.Context@1672bbb{/,null}
    2011-01-10 20:25:40,006 INFO  org.mortbay.log Graceful shutdown
org.mortbay.jetty.webapp.WebAppContext@18d30fb{/jsp,file:/home/ondra/work/Mavenhoe/trunk/target/classes/org/jboss/qa/mavenhoe/web/jsp}
    2011-01-10 20:25:43,007 INFO  org.mortbay.log Stopped
[email protected]:17283
    2011-01-10 20:25:43,009 WARN  org.mortbay.log 1 threads could not be
stopped
    2011-01-10 20:25:45,010 INFO  org.mortbay.log Shutdown hook
executing
    2011-01-10 20:25:45,011 INFO  org.mortbay.log Shutdown hook complete

It blocks for exactly one minute, then shuts down.
I've added the Graceful shutdown, which should allow me to shut the
server down from a servlet; However, it does not work as you can see
from the log.

I've solved it this way:

    Server server = new Server( PORT );
    server.setGracefulShutdown( 3000 );
    server.setStopAtShutdown(true);
    ...
    server.start();
 
    if( server.getThreadPool() instanceof QueuedThreadPool ){
       ((QueuedThreadPool)
server.getThreadPool()).setMaxIdleTimeMs( 2000 );
    }

`setMaxIdleTimeMs()` needs to be called after the `start()`, becase the
threadPool is created in `start()`. However, the threads are already
created and waiting, so it only applies after all threads are used at
least once.

I don't know what else to do except some awfulness like interrupting all
threads or `System.exit()`.

Any ideas? Is there a good way?

Thanks,
Ondra
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.