[英]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实现了它,并且效果很好。
这是当服务器收到
SIGINT
或SIGTERM
信号时要运行的挂钩的代码。
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.