1313import io .undertow .Undertow ;
1414import io .undertow .UndertowOptions ;
1515import io .undertow .server .HttpHandler ;
16+ import io .undertow .server .handlers .GracefulShutdownHandler ;
1617import io .undertow .server .handlers .encoding .EncodingHandler ;
1718import org .xnio .Options ;
1819
2324import java .util .Collections ;
2425import java .util .List ;
2526import java .util .Optional ;
27+ import java .util .concurrent .TimeUnit ;
2628
2729/**
2830 * Web server implementation using <a href="http://undertow.io/">Undertow</a>.
@@ -36,6 +38,8 @@ public class Utow extends Server.Base {
3638
3739 private Undertow server ;
3840
41+ private GracefulShutdownHandler shutdown ;
42+
3943 private List <Jooby > applications = new ArrayList <>();
4044
4145 private ServerOptions options = new ServerOptions ()
@@ -66,6 +70,8 @@ public class Utow extends Server.Base {
6670 handler = new EncodingHandler .Builder ().build (null ).wrap (handler );
6771 }
6872
73+ shutdown = new GracefulShutdownHandler (handler );
74+
6975 Undertow .Builder builder = Undertow .builder ()
7076 .addHttpListener (options .getPort (), options .getHost ())
7177 .setBufferSize (options .getBufferSize ())
@@ -82,7 +88,7 @@ public class Utow extends Server.Base {
8288 .setIoThreads (options .getIoThreads ())
8389 .setWorkerOption (Options .WORKER_NAME , "worker" )
8490 .setWorkerThreads (options .getWorkerThreads ())
85- .setHandler (handler );
91+ .setHandler (shutdown );
8692
8793 SSLContext sslContext = options .getSSLContext (application .getEnvironment ().getClassLoader ());
8894 if (sslContext != null ) {
@@ -109,14 +115,25 @@ public class Utow extends Server.Base {
109115 @ Nonnull @ Override public synchronized Server stop () {
110116 fireStop (applications );
111117 applications = null ;
118+ try {
119+ shutdown .shutdown ();
120+ shutdown .awaitShutdown (TimeUnit .SECONDS .toMillis (1 ));
121+ } catch (Exception x ) {
122+ throw SneakyThrows .propagate (x );
123+ } finally {
124+ shutdownServer ();
125+ }
126+ return this ;
127+ }
128+
129+ private void shutdownServer () {
112130 if (server != null ) {
113131 try {
114132 server .stop ();
115133 } finally {
116134 server = null ;
117135 }
118136 }
119- return this ;
120137 }
121138
122139}
0 commit comments