Use GracefulHandler for graceful shutdown of Jetty

See gh-51128

Signed-off-by: Alessio Attilio <309061723+alessio-attilio@users.noreply.github.com>
This commit is contained in:
Alessio Attilio
2026-07-27 19:47:20 +02:00
committed by Stéphane Nicoll
parent ccf6767e00
commit 12eeed09fe
4 changed files with 20 additions and 20 deletions
@@ -31,7 +31,7 @@ import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.NetworkConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.StatisticsHandler;
import org.eclipse.jetty.server.handler.GracefulHandler;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.jetty.reactive.JettyReactiveWebServerFactory;
@@ -94,23 +94,23 @@ public class JettyWebServer implements WebServer {
}
private @Nullable GracefulShutdown createGracefulShutdown(Server server) {
StatisticsHandler statisticsHandler = findStatisticsHandler(server);
if (statisticsHandler == null) {
GracefulHandler gracefulHandler = findGracefulHandler(server);
if (gracefulHandler == null) {
return null;
}
return new GracefulShutdown(server, statisticsHandler::getRequestsActive);
return new GracefulShutdown(server, () -> (int) (gracefulHandler.getCurrentRequestCount() + gracefulHandler.getCurrentStreamWrapperCount()));
}
private @Nullable StatisticsHandler findStatisticsHandler(Server server) {
return findStatisticsHandler(server.getHandler());
private @Nullable GracefulHandler findGracefulHandler(Server server) {
return findGracefulHandler(server.getHandler());
}
private @Nullable StatisticsHandler findStatisticsHandler(Handler handler) {
if (handler instanceof StatisticsHandler statisticsHandler) {
return statisticsHandler;
private @Nullable GracefulHandler findGracefulHandler(Handler handler) {
if (handler instanceof GracefulHandler gracefulHandler) {
return gracefulHandler;
}
if (handler instanceof Handler.Wrapper handlerWrapper) {
return findStatisticsHandler(handlerWrapper.getHandler());
return findGracefulHandler(handlerWrapper.getHandler());
}
return null;
}
@@ -24,7 +24,7 @@ import org.eclipse.jetty.ee11.servlet.ServletContextHandler;
import org.eclipse.jetty.ee11.servlet.ServletHolder;
import org.eclipse.jetty.server.NetworkConnectionLimit;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.StatisticsHandler;
import org.eclipse.jetty.server.handler.GracefulHandler;
import org.jspecify.annotations.Nullable;
import org.springframework.boot.jetty.ConfigurableJettyWebServerFactory;
@@ -121,9 +121,9 @@ public class JettyReactiveWebServerFactory extends JettyWebServerFactory
new ForwardHeadersCustomizer().customize(server);
}
if (getShutdown() == Shutdown.GRACEFUL) {
StatisticsHandler statisticsHandler = new StatisticsHandler();
statisticsHandler.setHandler(server.getHandler());
server.setHandler(statisticsHandler);
GracefulHandler gracefulHandler = new GracefulHandler();
gracefulHandler.setHandler(server.getHandler());
server.setHandler(gracefulHandler);
}
return server;
}
@@ -58,7 +58,7 @@ import org.eclipse.jetty.server.NetworkConnectionLimit;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.StatisticsHandler;
import org.eclipse.jetty.server.handler.GracefulHandler;
import org.eclipse.jetty.session.DefaultSessionCache;
import org.eclipse.jetty.session.FileSessionDataStore;
import org.eclipse.jetty.session.SessionConfig;
@@ -180,9 +180,9 @@ public class JettyServletWebServerFactory extends JettyWebServerFactory
new ForwardHeadersCustomizer().customize(server);
}
if (getShutdown() == Shutdown.GRACEFUL) {
StatisticsHandler statisticsHandler = new StatisticsHandler();
statisticsHandler.setHandler(server.getHandler());
server.setHandler(statisticsHandler);
GracefulHandler gracefulHandler = new GracefulHandler();
gracefulHandler.setHandler(server.getHandler());
server.setHandler(gracefulHandler);
}
return getJettyWebServer(server);
}
@@ -19,7 +19,7 @@ package org.springframework.boot.jetty.autoconfigure.reactive;
import jakarta.websocket.server.ServerContainer;
import org.eclipse.jetty.ee11.servlet.ServletContextHandler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.StatisticsHandler;
import org.eclipse.jetty.server.handler.GracefulHandler;
import org.junit.jupiter.api.Test;
import org.springframework.boot.jetty.JettyServerCustomizer;
@@ -77,7 +77,7 @@ class JettyReactiveWebServerAutoConfigurationTests extends AbstractReactiveWebSe
WebServer webServer = ((ReactiveWebServerApplicationContext) context.getSourceApplicationContext())
.getWebServer();
assertThat(webServer).isNotNull();
ServletContextHandler servletContextHandler = (ServletContextHandler) ((StatisticsHandler) ((JettyWebServer) webServer)
ServletContextHandler servletContextHandler = (ServletContextHandler) ((GracefulHandler) ((JettyWebServer) webServer)
.getServer()
.getHandler()).getHandler();
Object serverContainer = servletContextHandler.getContext()