2015-05-20 43 views
4

我有一個應用程序在嵌入式碼頭服務器上運行。現在我想開始/停止服務器作爲服務。 我使用腳本來啓動服務器。如何正常關閉嵌入式碼頭

java $JAVA_OPTS -DREQ_JAVA_VERSION=$JAVA_VERSION -jar myjetty.jar 

主類

Server server = new Server(); 
SelectChannelConnector connector = new SelectChannelConnector(); 
connector.setPort(PORT); 
server.addConnector(connector); 
HandlerCollection handlers = new HandlerCollection(); 
NCSARequestLog requestLog = new NCSARequestLog(); 
requestLog.setFilename(home + "/logs/access_" + logFileDateFormat 
      + ".log"); 
requestLog.setFilenameDateFormat(logFileDateFormat); 
requestLog.setRetainDays(10); 
requestLog.setAppend(true); 
requestLog.setExtended(false); 
requestLog.setLogCookies(false); 
requestLog.setLogTimeZone(TimeZone.getDefault().getID()); 
RequestLogHandler requestLogHandler = new RequestLogHandler(); 
requestLogHandler.setRequestLog(requestLog); 
handlers.addHandler(requestLogHandler); 
server.setHandler(handlers); 
server.start(); 
server.join(); 

這將啓動服務器。 Stopping and/or Restarting an embedded Jetty instance via web call可以用來停止服務器,但是, 如何從腳本停止服務器?以及我應該做什麼改變來在主類中關閉服務器。

+0

您想關閉服務器的時間? – SpaceTrucker

+0

您正在尋找'server.stop()'?如何以及何時會觸發關機? – SubOptimal

+1

就像一個服務'sudo服務myjetty start'啓動服務器和'sudo service myjetty stop'基本上server.stop()是我應該做的。但是我怎麼能調用它呢? – jos

回答

2

沒有關閉Jetty服務器的預定義解決方案。關閉Jetty服務器的唯一有序方法是在正在運行的服務器實例上調用方法stop()。您必須實現自己調用此方法的方式。

你可以做到這一點(例如)由...

  • 實現RMI服務器線程,並從RMI客戶
  • 實現的JMX MBean,並從客戶端調用的方法上調用一個方法該MBean
  • 實現像你已經張貼

如果你只是想尋找一種不依賴於額外的工具,如的方式鏈接描述的自定義處理程序,比你能解決這個問題,例如像以下(這是你自己的代碼與小的修改)

public class MyJetty { 

    public static void main(String[] args) throws Exception { 
     int PORT = 9103; 
     String home = System.getProperty("user.home"); 
     String logFileDateFormat = "yyyy_MM_dd"; 

     // execute a request to http://localhost:9103/stop 
     // instead of `curl -v http://localhost:9103/stop` 
     if (args.length == 1 && "stop".equalsIgnoreCase(args[0])) { 
      URL url = new URL("http", "localhost", PORT, "/stop"); 
      try (InputStream in = url.openStream()) { 
       int r; 
       while ((r = in.read()) != -1) { 
        System.out.write(r); 
       } 
       return; 
      } catch (IOException ex) { 
       System.err.println("stop Jetty failed: " + ex.getMessage()); 
      } 
     } 

     Server server = new Server(); 
     SelectChannelConnector connector = new SelectChannelConnector(); 
     connector.setPort(PORT); 
     server.addConnector(connector); 
     HandlerCollection handlers = new HandlerCollection(); 
     NCSARequestLog requestLog = new NCSARequestLog(); 
     requestLog.setFilename(home + "/logs/access_" + logFileDateFormat + ".log"); 
     requestLog.setFilenameDateFormat(logFileDateFormat); 
     requestLog.setRetainDays(10); 
     requestLog.setAppend(true); 
     requestLog.setExtended(false); 
     requestLog.setLogCookies(false); 
     requestLog.setLogTimeZone(TimeZone.getDefault().getID()); 
     RequestLogHandler requestLogHandler = new RequestLogHandler(); 
     requestLogHandler.setRequestLog(requestLog); 
     handlers.addHandler(requestLogHandler); 

     // the class YourHandler is the one from your link 
     handlers.addHandler(new YourHandler(server)); 

     server.setHandler(handlers); 
     server.start(); 
     server.join(); 
    } 
} 
  • 開始java MyJetty
  • 服務器與java MyJetty stop
+0

檢查jetty主類中的停止方法。 https://github.com/eclipse/jetty.project/blob/master/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java#L472。 – jos

+0

@jos但是這個解決方案不適用於你的發佈代碼。 – SubOptimal

4

可以停止服務器調用setStopTimeout(長超時)以相對優雅的方式關閉Jetty。調用此方法時必須配置statisticsHandler。

引用:Jetty Server.class setStopTimeout(long)

例如

YourServletHandler servletHandler = new YourServletHandler(); 
StatisticsHandler statsHandler = new StatisticsHandler(); 
statsHandler.setHandler(servletHandler); 

Server server = new Server(80); 
server.setHandler(statsHandler); 
server.setStopTimeout(3000L); 

//... 
server.start(); 

//... 
server.stop(); 
2

由於碼頭7.5.x,你可以在你的代碼中使用org.eclipse.jetty.server.handler.ShutdownHandler

Server server = new Server(8080); 
HandlerList handlers = new HandlerList(); 
handlers.setHandlers(new Handler[] 
{ someOtherHandler, new ShutdownHandler("secret_password", false, true) }); 
server.setHandler(handlers); 
server.start(); 

...這將允許您通過發出以下HTTP POST請求關閉碼頭:

curl -X POST http://localhost:8080/shutdown?token=secret_password 
+0

感謝您的回答,如果您喜歡,我可以幫助某人 – jos

+0

@jos,並在上面放一個戒指;) – diginoise