Jetty: программная остановка приводит к тому, что «1 поток не может быть остановлен»

У меня есть встроенный экземпляр Jetty 6.1.26. { {1}} Я хочу выключить его с помощью HTTP GET, отправленного на / shutdown . Итак, я создал 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);
 }

Однако, когда я отправляю запрос, Jetty не останавливается - поток продолжает висеть в org.mortbay.thread.QueuedThreadPool в строке с 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 SocketConnector@0.0.0.0: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 SocketConnector@0.0.0.0: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 SocketConnector@0.0.0.0:17283
2011-01-10 20:25:43,009 WARN  org.mortbay.log 1 threads could not be stopped
2011-01-10 20:26:43,010 INFO  org.mortbay.log Shutdown hook executing
2011-01-10 20:26:43,011 INFO  org.mortbay.log Shutdown hook complete

Он блокируется ровно на одну минуту, а затем отключается. Я добавил Graceful Shutdown, что должно позволить мне выключить сервер из сервлета; Однако это не работает, как видно из журнала.

Я решил это следующим образом:

Server server = new Server( PORT );
server.setGracefulShutdown( 3000 );
server.setStopAtShutdown(true);
...
server.start();

if( server.getThreadPool() instanceof QueuedThreadPool ){
   ((QueuedThreadPool) server.getThreadPool()).setMaxIdleTimeMs( 2000 );
}

setMaxIdleTimeMs () необходимо вызывать после start () , потому что threadPool создается в start () . Однако потоки уже созданы и ждут, поэтому он применяется только после того, как все потоки будут использованы хотя бы один раз.

Я не знаю, что еще делать, кроме какой-то неприятности вроде прерывания всех потоков или System.exit () .

Есть идеи? Есть хороший способ?

6
задан R. Oosterholt 6 June 2018 в 12:37
поделиться