java Grizzly优雅关机抛出InterruptedException
我正在使用jersey服务器,希望确保当服务器终止时(通常通过SIGTERM),所有当前运行的请求都能正常完成。如果卷足够大,如果我不这样做,可能会丢失数据
所以我想打电话给HttpServer。来自运行时关闭挂钩的shutdown()
我认为它工作正常,除了一个问题CompletionHandler。调用failed(),并带有InterruptedException。shutdownNow位于堆栈跟踪中,因此似乎在关闭本身完成后发生了一些逻辑错误:
java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1302)
at org.glassfish.grizzly.impl.SafeFutureImpl$Sync.innerGet(SafeFutureImpl.java:354)
at org.glassfish.grizzly.impl.SafeFutureImpl.get(SafeFutureImpl.java:265)
at org.glassfish.grizzly.impl.SafeFutureImpl.notifyCompletionHandlers(SafeFutureImpl.java:181)
at org.glassfish.grizzly.impl.SafeFutureImpl.done(SafeFutureImpl.java:287)
at org.glassfish.grizzly.impl.SafeFutureImpl$Sync.innerSet(SafeFutureImpl.java:383)
at org.glassfish.grizzly.impl.SafeFutureImpl.result(SafeFutureImpl.java:112)
at org.glassfish.grizzly.http.server.HttpServer.shutdownNow(HttpServer.java:458)
at org.glassfish.grizzly.http.server.HttpServer$1.completed(HttpServer.java:384)
at org.glassfish.grizzly.http.server.HttpServer$1.completed(HttpServer.java:376)
at org.glassfish.grizzly.impl.SafeFutureImpl.notifyCompletionHandlers(SafeFutureImpl.java:199)
at org.glassfish.grizzly.impl.SafeFutureImpl.done(SafeFutureImpl.java:287)
at org.glassfish.grizzly.impl.SafeFutureImpl$Sync.innerSet(SafeFutureImpl.java:383)
at org.glassfish.grizzly.impl.SafeFutureImpl.result(SafeFutureImpl.java:112)
at org.glassfish.grizzly.http.server.NetworkListener$1$1.completed(NetworkListener.java:698)
at org.glassfish.grizzly.http.server.NetworkListener$1$1.completed(NetworkListener.java:693)
at org.glassfish.grizzly.http.server.HttpServerFilter.prepareForShutdown(HttpServerFilter.java:328)
at org.glassfish.grizzly.http.server.NetworkListener$1.shutdownRequested(NetworkListener.java:704)
at org.glassfish.grizzly.nio.GracefulShutdownRunner.run(GracefulShutdownRunner.java:93)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
我把它归结为这个测试用例,它不使用jersey或shutdownhook。这很简单,同样的异常也会发生(事实上,上面的内容是从这个程序的输出中复制的):
public class Server {
public static void main(String[] args) throws IOException {
HttpServer server = HttpServer.createSimpleServer();
server.start();
try { Thread.sleep(5000); } catch (InterruptedException ex) {}
shutdown(server);
}
public static void shutdown (HttpServer server) {
final boolean [] done = {false};
server.shutdown().addCompletionHandler(new EmptyCompletionHandler<HttpServer>() {
public void completed (HttpServer arg) {
System.out.println("Shutdown completed");
done[0] = true;
}
public void failed (Throwable error) {
System.out.println("Shutdown failed");
error.printStackTrace(System.out);
done[0] = true;
}
});
while (!done[0]) {
try { Thread.sleep(100); } catch (InterruptedException ex) {}
}
System.out.println("Goodbye");
}
}
臭虫在哪里
共 (0) 个答案