gpt4 book ai didi

java - 正常关闭 Grizzly 服务器的正确方法是什么? (嵌入 Jersey )

转载 作者:行者123 更新时间:2023-11-30 02:29:34 25 4
gpt4 key购买 nike

我有以下代码来启动使用 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,并使用 gradle run 命令运行服务器。Gradle 任务可以完成这项工作吗?

我还看到了关于优雅地终止 grizzly 传输的内容: http://grizzly-nio.net/2013/08/gracefully-terminating-a-grizzly-transport/但我不确定我是否需要使用它。我不明白如何使用它。

编辑:我看到这篇文章: https://stackoverflow.com/a/15391081/3982755这是在生产环境中终止 Http 服务器的可接受的方法吗?

最佳答案

没有答案,所以我将发布我自己的答案,我使用 Shutdown Hook 实现了它,并且效果很好。

  • 服务器将等待所有连接终止后再关闭。
  • 为了避免连接永远不会终止而永远被阻止,我们设置了一个宽限期(60 秒)
  • 宽限期过后,服务器将强制终止所有连接

Here is the code for the hook to be run when the server receives a SIGINT or SIGTERM signal.

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.");
}
}

Then I register the Hook into the RunTime object this way when I setup the server:

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

And finally, I start the server this way:

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);
}

关于java - 正常关闭 Grizzly 服务器的正确方法是什么? (嵌入 Jersey ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44572276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com