2015-10-14 50 views
0

我有一个嵌入式jetty项目,它构建了一个启动我们的webapp的单个.jar文件。如何关闭嵌入式码头实例?

public static void main(String[] args){    
      final Server server = new Server(threadPool); 
      //Do config/setup code for servlets/database/contexts/connectors/etc 
      server.start(); 
      server.dumpStdErr(); 
      server.join(); 
} 

所以,尽管这个伟大工程,通过调用java的我很茫然一种方式来阻止它的罐子MyApp.jar开始我们的服务器。当我想通过我们的构建服务器停止服务器时,这特别恼人。

当我们采用的是Jetty服务和部署.war文件,我们可以这样做:

  1. 通过詹金斯打造最新.war文件
  2. 通过shell (须藤服务码头站)
  3. 停止码头服务
  4. 覆盖原有.war文件中的/ opt /码头/ webapp的新.war文件
  5. 通过shell (须藤服务码头开始)
  6. 开始码头服务

我目前有两个想法:

  1. 创建调用server.stop()如果你有指定一个秘密获取参数的servlet。在Jekins的壳上使用卷曲来击中这个servlet。
  2. 使用类似Apache-Commons守护程序包装器将我的应用程序变为服务。

是否有一些明显的机制我缺少停止服务器?

+0

确实发送杀死进程的工作? – radai

回答

4

使用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(); 

的客户端(发出关机)。

public static void attemptShutdown(int port, String shutdownCookie) { 
    try { 
     URL url = new URL("http://localhost:" + port + "/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); 
    } 
} 
+0

你做了我的一天。 – benstpierre