@@ -519,6 +519,7 @@ static void configureH2Pipeline(ChannelPipeline p,
519519 @ Nullable BiPredicate <HttpServerRequest , HttpServerResponse > compressPredicate ,
520520 ServerCookieDecoder cookieDecoder ,
521521 ServerCookieEncoder cookieEncoder ,
522+ boolean enableGracefulShutdown ,
522523 HttpServerFormDecoderProvider formDecoderProvider ,
523524 @ Nullable BiFunction <ConnectionInfo , HttpRequest , ConnectionInfo > forwardedHeaderHandler ,
524525 Http2Settings http2Settings ,
@@ -538,6 +539,12 @@ static void configureH2Pipeline(ChannelPipeline p,
538539 .validateHeaders (validate )
539540 .initialSettings (http2Settings );
540541
542+ if (enableGracefulShutdown ) {
543+ // Configure the graceful shutdown with indefinite timeout as Reactor Netty controls the timeout
544+ // when disposeNow(timeout) is invoked
545+ http2FrameCodecBuilder .gracefulShutdownTimeoutMillis (-1 );
546+ }
547+
541548 if (p .get (NettyPipeline .LoggingHandler ) != null ) {
542549 http2FrameCodecBuilder .frameLogger (new Http2FrameLogger (LogLevel .DEBUG ,
543550 "reactor.netty.http.server.h2" ));
@@ -569,6 +576,7 @@ static void configureHttp11OrH2CleartextPipeline(ChannelPipeline p,
569576 ServerCookieDecoder cookieDecoder ,
570577 ServerCookieEncoder cookieEncoder ,
571578 HttpRequestDecoderSpec decoder ,
579+ boolean enableGracefulShutdown ,
572580 HttpServerFormDecoderProvider formDecoderProvider ,
573581 @ Nullable BiFunction <ConnectionInfo , HttpRequest , ConnectionInfo > forwardedHeaderHandler ,
574582 Http2Settings http2Settings ,
@@ -587,7 +595,7 @@ static void configureHttp11OrH2CleartextPipeline(ChannelPipeline p,
587595 decoder .allowDuplicateContentLengths ());
588596
589597 Http11OrH2CleartextCodec upgrader = new Http11OrH2CleartextCodec (accessLogEnabled , accessLog , compressPredicate ,
590- cookieDecoder , cookieEncoder , p .get (NettyPipeline .LoggingHandler ) != null , formDecoderProvider ,
598+ cookieDecoder , cookieEncoder , p .get (NettyPipeline .LoggingHandler ) != null , enableGracefulShutdown , formDecoderProvider ,
591599 forwardedHeaderHandler , http2Settings , httpMessageLogFactory , listener , mapHandle , metricsRecorder ,
592600 minCompressionSize , opsFactory , uriTagValue , decoder .validateHeaders ());
593601
@@ -912,6 +920,7 @@ static final class Http11OrH2CleartextCodec extends ChannelInitializer<Channel>
912920 ServerCookieDecoder cookieDecoder ,
913921 ServerCookieEncoder cookieEncoder ,
914922 boolean debug ,
923+ boolean enableGracefulShutdown ,
915924 HttpServerFormDecoderProvider formDecoderProvider ,
916925 @ Nullable BiFunction <ConnectionInfo , HttpRequest , ConnectionInfo > forwardedHeaderHandler ,
917926 Http2Settings http2Settings ,
@@ -935,6 +944,12 @@ static final class Http11OrH2CleartextCodec extends ChannelInitializer<Channel>
935944 .validateHeaders (validate )
936945 .initialSettings (http2Settings );
937946
947+ if (enableGracefulShutdown ) {
948+ // Configure the graceful shutdown with indefinite timeout as Reactor Netty controls the timeout
949+ // when disposeNow(timeout) is invoked
950+ http2FrameCodecBuilder .gracefulShutdownTimeoutMillis (-1 );
951+ }
952+
938953 if (debug ) {
939954 http2FrameCodecBuilder .frameLogger (new Http2FrameLogger (
940955 LogLevel .DEBUG ,
@@ -981,6 +996,7 @@ static final class H2OrHttp11Codec extends ApplicationProtocolNegotiationHandler
981996 final ServerCookieDecoder cookieDecoder ;
982997 final ServerCookieEncoder cookieEncoder ;
983998 final HttpRequestDecoderSpec decoder ;
999+ final boolean enableGracefulShutdown ;
9841000 final HttpServerFormDecoderProvider formDecoderProvider ;
9851001 final BiFunction <ConnectionInfo , HttpRequest , ConnectionInfo > forwardedHeaderHandler ;
9861002 final Http2Settings http2Settings ;
@@ -1003,6 +1019,7 @@ static final class H2OrHttp11Codec extends ApplicationProtocolNegotiationHandler
10031019 this .cookieDecoder = initializer .cookieDecoder ;
10041020 this .cookieEncoder = initializer .cookieEncoder ;
10051021 this .decoder = initializer .decoder ;
1022+ this .enableGracefulShutdown = initializer .enableGracefulShutdown ;
10061023 this .formDecoderProvider = initializer .formDecoderProvider ;
10071024 this .forwardedHeaderHandler = initializer .forwardedHeaderHandler ;
10081025 this .http2Settings = initializer .http2Settings ;
@@ -1027,7 +1044,7 @@ protected void configurePipeline(ChannelHandlerContext ctx, String protocol) {
10271044
10281045 if (ApplicationProtocolNames .HTTP_2 .equals (protocol )) {
10291046 configureH2Pipeline (p , accessLogEnabled , accessLog , compressPredicate , cookieDecoder , cookieEncoder ,
1030- formDecoderProvider , forwardedHeaderHandler , http2Settings , httpMessageLogFactory , idleTimeout ,
1047+ enableGracefulShutdown , formDecoderProvider , forwardedHeaderHandler , http2Settings , httpMessageLogFactory , idleTimeout ,
10311048 listener , mapHandle , metricsRecorder , minCompressionSize , opsFactory , uriTagValue , decoder .validateHeaders ());
10321049 return ;
10331050 }
@@ -1056,6 +1073,7 @@ static final class HttpServerChannelInitializer implements ChannelPipelineConfig
10561073 final ServerCookieDecoder cookieDecoder ;
10571074 final ServerCookieEncoder cookieEncoder ;
10581075 final HttpRequestDecoderSpec decoder ;
1076+ final boolean enableGracefulShutdown ;
10591077 final HttpServerFormDecoderProvider formDecoderProvider ;
10601078 final BiFunction <ConnectionInfo , HttpRequest , ConnectionInfo > forwardedHeaderHandler ;
10611079 final Http2Settings http2Settings ;
@@ -1080,6 +1098,7 @@ static final class HttpServerChannelInitializer implements ChannelPipelineConfig
10801098 this .cookieDecoder = config .cookieDecoder ;
10811099 this .cookieEncoder = config .cookieEncoder ;
10821100 this .decoder = config .decoder ;
1101+ this .enableGracefulShutdown = config .channelGroup () != null ;
10831102 this .formDecoderProvider = config .formDecoderProvider ;
10841103 this .forwardedHeaderHandler = config .forwardedHeaderHandler ;
10851104 this .http2Settings = config .http2Settings ();
@@ -1147,6 +1166,7 @@ else if ((protocols & h2) == h2) {
11471166 compressPredicate (compressPredicate , minCompressionSize ),
11481167 cookieDecoder ,
11491168 cookieEncoder ,
1169+ enableGracefulShutdown ,
11501170 formDecoderProvider ,
11511171 forwardedHeaderHandler ,
11521172 http2Settings ,
@@ -1171,6 +1191,7 @@ else if ((protocols & h2) == h2) {
11711191 cookieDecoder ,
11721192 cookieEncoder ,
11731193 decoder ,
1194+ enableGracefulShutdown ,
11741195 formDecoderProvider ,
11751196 forwardedHeaderHandler ,
11761197 http2Settings ,
@@ -1212,6 +1233,7 @@ else if ((protocols & h2c) == h2c) {
12121233 compressPredicate (compressPredicate , minCompressionSize ),
12131234 cookieDecoder ,
12141235 cookieEncoder ,
1236+ enableGracefulShutdown ,
12151237 formDecoderProvider ,
12161238 forwardedHeaderHandler ,
12171239 http2Settings ,
0 commit comments