Java 正确的关闭Grizzly服务器的方法是什么?(嵌有球衣)
我有下面的代码来启动一个运行Jersey的基本嵌入式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
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);
}