diff --git a/jetty-core/jetty-server/src/main/config/etc/jetty-graceful.xml b/jetty-core/jetty-server/src/main/config/etc/jetty-graceful.xml index bd41482a1df9..89bbaf613e24 100644 --- a/jetty-core/jetty-server/src/main/config/etc/jetty-graceful.xml +++ b/jetty-core/jetty-server/src/main/config/etc/jetty-graceful.xml @@ -8,7 +8,9 @@ - + + + diff --git a/jetty-core/jetty-server/src/main/config/modules/graceful.mod b/jetty-core/jetty-server/src/main/config/modules/graceful.mod index 686f6961099c..e67227491e33 100644 --- a/jetty-core/jetty-server/src/main/config/modules/graceful.mod +++ b/jetty-core/jetty-server/src/main/config/modules/graceful.mod @@ -16,5 +16,8 @@ etc/jetty-graceful.xml # tag::documentation[] ## The timeout, in milliseconds, to apply when stopping the server gracefully. # jetty.server.stopTimeout=5000 + +## The idleTimeout, in milliseconds, to apply to active connections during a graceful shutdown, or to -1 to disable this mechanism. +# jetty.graceful.shutdownIdleTimeout=1000 # end::documentation[] diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java index f3d66224d8eb..fd1c514ae89f 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java @@ -245,10 +245,6 @@ public long getIdleTimeout() public void setIdleTimeout(long idleTimeout) { _idleTimeout = idleTimeout; - if (_idleTimeout == 0) - _shutdownIdleTimeout = 0; - else if (_idleTimeout < _shutdownIdleTimeout) - _shutdownIdleTimeout = Math.min(1000L, _idleTimeout); } /** @@ -791,4 +787,12 @@ public String toString() hashCode(), getDefaultProtocol(), getProtocols().stream().collect(Collectors.joining(", ", "(", ")"))); } + + @Override + public void dump(Appendable out, String indent) throws IOException + { + dumpObjects(out, indent, + String.format("idleTimeout=%s", _idleTimeout), + String.format("shutdownIdleTimeout=%s", _shutdownIdleTimeout)); + } } diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/GracefulHandler.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/GracefulHandler.java index d9f76891713f..6232aa58921d 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/GracefulHandler.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/GracefulHandler.java @@ -18,6 +18,8 @@ import java.util.function.Function; import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.server.AbstractConnector; +import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.HttpStream; import org.eclipse.jetty.server.Request; @@ -39,6 +41,7 @@ public class GracefulHandler extends Handler.Wrapper implements Graceful private final AtomicLong _requests = new AtomicLong(); private final AtomicLong _streamWrappers = new AtomicLong(); private final Shutdown _shutdown; + private Long _shutdownIdleTimeout; public GracefulHandler() { @@ -74,6 +77,11 @@ public long getCurrentStreamWrapperCount() return _streamWrappers.longValue(); } + public void setShutdownIdleTimeout(long shutdownIdleTimeout) + { + _shutdownIdleTimeout = shutdownIdleTimeout; + } + /** * Flag indicating that Graceful shutdown has been initiated. * @@ -131,6 +139,18 @@ protected void doStart() throws Exception { // Reset _shutdown in doStart instead of doStop so that the isShutdown() == true state is preserved while stopped. _shutdown.cancel(); + + if (_shutdownIdleTimeout != null) + { + for (Connector connector : getServer().getConnectors()) + { + if (connector instanceof AbstractConnector abstractConnector) + { + abstractConnector.setShutdownIdleTimeout(_shutdownIdleTimeout); + } + } + } + super.doStart(); }