1

組み込みアプリケーション サーバーとして Jetty を使用する webapp があります。また、次のコマンドを使用して実行するとサーバーを起動する Main クラスもセットアップしました。

java -jar foo.war

この部分では、すべてが期待どおりに機能しています。私が現在抱えている問題は、これをジェンキンスと統合することです。

バッチ コマンドとして実行するjava -jar foo.warと、サーバーは起動しますが、ビルドは終了しません。サーバー コンソールが表示され続けるだけです (結局のところ、すべてが同じプロセスの一部であるため、意味があります)。新しいプロセスを生成することになっていると思いますが、サーバーの起動後に新しいプロセスを生成してメインプロセスに「通知」するにはどうすればよいですか?

アプリケーションサーバーが起動された後にのみ、受け入れテスト (別名セレンテスト) を実行する必要があります。

Jenkins は (残念ながら) Windows Server で実行されています。それが関連しているかどうかはわかりませんが、以下はアプリケーションサーバーを起動するために使用するコードです(少し簡略化されています):

public static void main(String[] args) throws Exception {
  Server server = new Server(8082);
  server.setHandler(getHandlers(server));
  server.setStopAtShutdown(true);
  server.start();
  server.join();
}

private static HandlerList getHandlers(Server server) {
  ProtectionDomain protectionDomain = WebServer.class.getProtectionDomain();
  URL location = protectionDomain.getCodeSource().getLocation();
  WebAppContext webapp = new WebAppContext(location.toExternalForm(), "/");
  HandlerList handlers = new HandlerList();
  handlers.setHandlers(new Handler[] {
    webapp
  });
 return handlers;
}
4

2 に答える 2

1

このserver.join();呼び出しはmain()、サーバーが停止するまで現在のスレッド (実行中のスレッド) を待機させます。

server.setStopAtShutdown(true)単体テスト内に埋め込む場合も必要ありません。

以下を実行するだけです。

  • サーバーを構築します (@BeforeClassたとえば、junit を使用)
  • ハンドラーを追加する
  • server.start();
  • テストを実行する
  • server.stop();
于 2013-08-08T17:37:14.053 に答える
0

サーバーの起動と停止を担当する小さな CLI プログラム (JCommander を使用) を作成しました。例として:

java -jar jetty-cli -start -warFile C:\\app.war
java -jar jetty-cli -stop -password shutdownpassword

サーバーの起動

サーバーが起動したことがわかるまで、新しいプロセスを生成し (を使用してRuntime.getRuntime())、実行可能な war ファイルを実行し、コンソール出力をキャプチャします。このアプローチに満足しているとは言えません (サーバーの出力をキャプチャして、サーバーがいつ起動したかを検出するのは好きではありません)。ともかく:

//Server
server.addLifeCycleListener(new AbstractLifeCycle.AbstractLifeCycleListener() {
    @Override
    public void lifeCycleStarted(LifeCycle event) {
       System.out.println(STARTED_MESSAGE);
    }
});


//CLI
Process warProcess = Runtime.getRuntime().exec("java -jar " + options.getWarFile());
InputStream inputStream = warProcess .getInputStream();
InputStreamReader streamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(streamReader);
String line;
while ((line = bufferedReader .readLine()) != null) {
  if (line.contains(STARTED_MESSAGE)) {
     System.exit(0);
  }
}

サーバーの停止:

ShutdownHandlerへの有効な POST 要求でサーバーをシャットダウンする、Jetty 独自の を使用しましたhttp://localhost:<port>/shutdown/?token=<shutdowntoken>

private Handler createShutdownHandler(Server server) {
    return new ShutdownHandler(server, "shutdownpassword");
}

だから私がする必要があるのは、への POST リクエストだけhttp://localhost:8080/shutdown?token=shutdownpasswordです。

于 2013-08-19T11:10:49.707 に答える