Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正确的关闭Grizzly服务器的方法是什么?(嵌有球衣)_Java_Server_Jersey_Shutdown_Grizzly - Fatal编程技术网

Java 正确的关闭Grizzly服务器的方法是什么?(嵌有球衣)

Java 正确的关闭Grizzly服务器的方法是什么?(嵌有球衣),java,server,jersey,shutdown,grizzly,Java,Server,Jersey,Shutdown,Grizzly,我有下面的代码来启动一个运行Jersey的基本嵌入式Grizzly服务器 private static void startServer() { ServerResourceConfiguration configuration = new ServerResourceConfiguration(); HttpServer server = GrizzlyHttpServerFactory.createHttpServer( URI.create(B

我有下面的代码来启动一个运行Jersey的基本嵌入式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,并使用
gradlerun
命令运行服务器。 Gradle任务可以完成这项工作吗

我还看到过关于优雅地终止灰熊运输的故事: 但我不确定我是否需要使用它。我不知道如何使用它

编辑:我看到了这篇文章:
这是在生产环境中终止Http服务器的一种可接受的方式吗

没有答案,所以我会发布我自己的,我用一个关机钩子实现了它,它运行得非常好

  • 服务器将在关闭之前等待所有连接终止
  • 为了避免在连接从未终止时永远被阻塞,我们设置了一个宽限期(60秒)
  • 宽限期过后,服务器将强制终止所有连接
以下是服务器收到
SIGINT
SIGTERM
信号时要运行的钩子代码

最后,我以这种方式启动服务器:


httpServer.shutdown()?我的意思是我想替换“按一个键停止”机制。它看起来有点脆弱。难道没有办法用终端命令阻止它吗?(杀戮-9除外)?谢谢,我可能会尝试使用
Ctrl+C
和关机挂钩的解决方案。
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.");
  }
}
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);
}