簡體   English   中英

正常關閉Grizzly服務器的正確方法是什么? (嵌入澤西島)

[英]What is the proper way to gracefully shutdown a Grizzly server? (Embedded with Jersey)

我有以下代碼來啟動在Jersey上運行的基本Embedded Grizzly服務器。

  private static void startServer() {
    ServerResourceConfiguration configuration = new ServerResourceConfiguration();

    HttpServer server = GrizzlyHttpServerFactory.createHttpServer(
            URI.create(BASE_URI),
            configuration,
            false,
            null,
            false);

    server.start();

    if (System.in.read() > -2) {
      server.shutdownNow();
    }
  }

這看起來不像生產級別的停止服務器的方式。 正常關閉它的最佳實踐是什么? 我猜想是某種終端命令。 終止該進程會奏效,但不是很正常。

我在此項目上使用Gradle,並使用gradle run命令運行服務器。 Gradle任務可以完成這項工作嗎?

我也看到了有關優雅終止灰熊運輸的信息: http : //grizzly-nio.net/2013/08/gracefully-terminate-a-grizzly-transport/但我不確定是否需要使用它。 我不知道如何使用它。

編輯:我遇到了這篇文章: https : //stackoverflow.com/a/15391081/3982755這是在生產環境中終止Http服務器的可接受方法嗎?

沒有答案,所以我將發布自己的答案,我用一個Shutdown Hook實現了它,並且效果很好。

  • 服務器將在關閉之前等待所有連接終止。
  • 為了避免連接永遠不會終止而永遠被阻塞,我們設置了寬限期(60秒)
  • 寬限期過后,服務器將強制終止所有連接

這是當服務器收到SIGINTSIGTERM信號時要運行的掛鈎的代碼。

public class GrizzlyServerShutdownHookThread extends Thread {

  public static final String THREAD_NAME = "Grizzly Server Shutdown Hook";

  public static final int GRACE_PERIOD = 60;
  public static final TimeUnit GRACE_PERIOD_TIME_UNIT = TimeUnit.SECONDS;

  private final HttpServer server;

  /**
   * @param server The server to shut down
   */
  public GrizzlyServerShutdownHookThread(HttpServer server) {
    this.server = server;
    setName(THREAD_NAME);
  }

  @Override
  public void run() {
    LOG.info("Running Grizzly Server Shutdown Hook.");
    LOG.info("Shutting down server.");
    GrizzlyFuture<HttpServer> future = server.shutdown(GRACE_PERIOD, GRACE_PERIOD_TIME_UNIT);

    try {
      LOG.info(format("Waiting for server to shut down... Grace period is %s %s", GRACE_PERIOD, GRACE_PERIOD_TIME_UNIT));
      future.get();
    } catch(InterruptedException | ExecutionException e) {
      LOG.error("Error while shutting down server.", e);
    }

    LOG.info("Server stopped.");
  }
}

然后,當我設置服務器時,以這種方式將Hook注冊到RunTime對象中:

Runtime.getRuntime().addShutdownHook(
    new GrizzlyServerShutdownHookThread(server)
);

最后,我以這種方式啟動服務器:

try {
  server.start();
} catch (IOException e) {
  throw new RuntimeException(e);
}
// wait for a SIGINT (Ctrl+c) signal to shut down
try {
  LOG.info("Press CTRL^C to exit..");
  Thread.currentThread().join();
} catch(InterruptedException e) {
  throw new RuntimeException(e);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM