2016-03-21 7 views
1

У меня встроенный Jetty в мое приложение RCP Eclipse успешно. В моем приложении RCP, когда пользователь нажимает кнопку, открывается браузер и отображается страница сервлета. Файлы jsp находятся в разделенном каталоге, это веб-приложение angulajs.Завершение работы Embedded Jetty Server программно в Eclipse RCP

Я пытаюсь отключить встроенный сервер Jetty от плагина Uclick Eclipse, когда пользователь закрывает RCP. Сервер запускается в классе с именем Workshop, который является частью веб-проекта, поэтому у меня нет доступа к экземпляру сервера для вызова сервера .stop() из Eclipse UI Plugin. Я пробовал код ниже, но в вену. 1> Настройка ShutdownHook для Workshop класс веб-проекта

server = new Server(); 
server.setConnectors(new Connector[] { connector }); 
server.setHandler(handlers); 
server.start(); 
handlers.addHandler(new ShutdownHandler(server, "abc")); 
server.setStopAtShutdown(true); 
server.setGracefulShutdown(7_000); 
ShutdownThread.getInstance().run(); 

2> В моем Eclipse UI плагин, я добавил

Runtime.getRuntime().addShutdownHook(new Thread() { 
      @Override 
      public void run() { 
       try { 
      URL url = new URL("http://localhost:" + resultPortNo + "/shutdown?token=" + shutdownCookie); 
      HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
      connection.setRequestMethod("POST"); 
      connection.getResponseCode(); 
      logger.info("Shutting down " + url + ": " + connection.getResponseMessage()); 
     } catch (SocketException e) { 
      // logger.debug("Not running"); 
      // Okay - the server is not running 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
      } 
     }); 

HtppUrlConnection бросками ответ 404-NotFound code.So Jetty сервер все еще работает , Как мы обрабатываем встроенное закрытие Jetty из Eclipse UI Plugin.

Я прочитал много статей, но не могу найти ответ на мой вопрос.

Любая помощь будет оценена. Спасибо.

ответ

0

Проблема: каждый раз, когда вызывался jettyServer.stop, прерывалось исключение прерывания, а сервер причалов продолжал работать.

Решение: (1) Добавлена ​​Палач Service с демоном потока в коде сервлета, чтобы остановить сервер Jetty

JettyShutdownServlet.js 
----------------------- 
    ExecutorService pool = Executors.newSingleThreadExecutor(new ThreadFactory() { 
       @Override 
       public Thread newThread(Runnable runnable) { 
        Thread thread = Executors.defaultThreadFactory().newThread(runnable); 
        thread.setDaemon(true); 
        return thread; 
       } 
      }); 

      pool.execute(new Runnable() { 
       @Override 
       public void run() { 
        if (null != jettyServer) { 
         try { 
          jettyServer.stop(); 
          jettyServer.join(); 
         } catch (Exception e) { 
          logger.info("Error when stopping Jetty: " + e.getMessage()); 
         } 
        } 

       } 
      }); 

(2) Добавление сервлет внутри кода запуска Jetty.

servletContextHandler.addServlet(new ServletHolder(new JettyShutdownServlet(server)), "/shutdown"); 

(3) Добавление shutdownhook затмить класса интерфейса

Runtime.getRuntime().addShutdownHook(new Thread() { 
      @Override 
      public void run() { 
      try { 
      String shutdownurl = "http://localhost:" + resultPortNo + "/api/shutdown"; 
      URL url = new URL(shutdownurl); 
      HttpURLConnection connection =(HttpURLConnection)url.openConnection(); 
      connection.setRequestMethod("GET"); 
      try { 
       connection.getResponseCode(); 
       connection.disconnect(); 
      } catch (SocketException e) { 
       // logger.debug("Not running"); 
       // Okay - the server is not running 
       connection.disconnect(); 
      } 
     } catch (Exception x) { 
     // exception during shutdown 
     Activator.error("Unable to shutdown Jetty Server.\n" + x.getMessage()); 
       } 
      } 
     }); 

Это решило мою проблему, и надеюсь, что это будет иметь некоторую помощь другим.