2016-03-21 8 views
1

Eclipse RCPアプリケーションにJettyを正常に埋め込んでいます。 私のRCPアプリケーションでは、ユーザーがボタンをクリックすると、ブラウザが開き、いくつかのサーブレットページが表示されます。 jspファイルは別々のディレクトリにあり、angulajs Webアプリケーションです。Eclipse RCPでEmbedded Jetty Serverをプログラムでシャットダウン

ユーザーがRCPを閉じるときにEclipse UIプラグインから組み込みJettyサーバーをシャットダウンしようとしています。サーバーがWebプロジェクトの一部であるWorkshopというクラスで開始されているため、サーバーインスタンス.stop()Eclipse UI Plugin.Iから、以下のコードを試しましたが、静脈内です。私のEclipseのUIプラグインでWebプロジェクトの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>へ 1>設定ShutdownHook、私は

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桟橋サーバーがまだ実行されているスロー追加されました。 Eclipse UI Pluginから組み込みJettyシャットダウンを処理するにはどうすればいいですか?

私は多くの記事を読んでいましたが、私の質問に対する答えは見つかりませんでした。

ご協力いただければ幸いです。ありがとうございます。

答えて

0

問題:jettyServer.stopが呼び出されるたびに、割り込み例外がスローされ、jettyサーバーが引き続き実行されます。

対処:サーブレットコードでデーモンスレッド(1)を加えキュータサービス桟橋サーバ

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)桟橋スタートアップコードの内部サーブレットを追加します。

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

(3)UIクラスをEclipseに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()); 
       } 
      } 
     }); 

これは私の問題を解決し、それが他の人にいくつかの助けになることを願っています。

関連する問題