Fix Restconf server shutdown 12/11012/1
authorMarek Gradzki <mgradzki@cisco.com>
Wed, 7 Mar 2018 14:03:35 +0000 (15:03 +0100)
committerMarek Gradzki <mgradzki@cisco.com>
Wed, 7 Mar 2018 14:06:37 +0000 (15:06 +0100)
Change-Id: Ia7c0fc2d269ae88170297ef22476c8a61121238a
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/JettyServerStarter.java
infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfModule.java

index 1bd50bb..7f5673c 100644 (file)
@@ -23,6 +23,7 @@ import com.google.inject.Inject;
 import com.google.inject.name.Named;
 import io.fd.honeycomb.binding.init.ProviderTrait;
 
+import io.fd.honeycomb.data.init.ShutdownHandler;
 import javax.annotation.Nullable;
 
 import org.eclipse.jetty.server.Server;
@@ -31,7 +32,7 @@ import org.opendaylight.netconf.sal.rest.api.RestConnector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-class JettyServerStarter extends ProviderTrait<JettyServerStarter.ServerInit> {
+class JettyServerStarter extends ProviderTrait<JettyServerStarter.RestconfJettyServer> {
 
     private static final Logger LOG = LoggerFactory.getLogger(JettyServerStarter.class);
 
@@ -54,21 +55,41 @@ class JettyServerStarter extends ProviderTrait<JettyServerStarter.ServerInit> {
     @Named(RESTCONF_HTTPS)
     private ServerConnector httpsConnectorInit;
 
+    @Inject
+    private ShutdownHandler shutdownHandler;
+
     @Override
-    protected ServerInit create() {
-        try {
-            LOG.info("Starting RESTCONF Jetty server");
-            server.start();
-            LOG.info("RESTCONF Jetty server successfully started");
-        } catch (Exception e) {
-            LOG.error("Unable to start RESTCONF Jetty server", e);
-            throw new IllegalStateException("Unable to start RESTCONF Jetty server", e);
+    protected RestconfJettyServer create() {
+        final RestconfJettyServer jettyServer = new RestconfJettyServer(server);
+        jettyServer.start();
+        shutdownHandler.register(RestconfJettyServer.class.getCanonicalName(), jettyServer);
+        return jettyServer;
+    }
+
+    final class RestconfJettyServer implements AutoCloseable {
+        private final Server server;
+
+        private RestconfJettyServer(final Server server) {
+            this.server = server;
         }
 
-        return new ServerInit() {
-        };
-    }
+        private void start() {
+            try {
+                LOG.info("Starting RESTCONF Jetty server");
+                server.start();
+                LOG.info("RESTCONF Jetty server successfully started");
+            } catch (Exception e) {
+                LOG.error("Unable to start RESTCONF Jetty server", e);
+                throw new IllegalStateException("Unable to start RESTCONF Jetty server", e);
+            }
+        }
 
-    interface ServerInit {
+        @Override
+        public void close() throws Exception {
+            LOG.info("Stopping RESTCONF Jetty server");
+            server.stop();
+            server.destroy();
+            LOG.info("RESTCONF Jetty server successfully stopped");
+        }
     }
 }
index 9f9ecf7..1a59b72 100644 (file)
@@ -19,7 +19,7 @@ package io.fd.honeycomb.northbound.restconf;
 import com.google.inject.Singleton;
 import com.google.inject.name.Names;
 import io.fd.honeycomb.northbound.NorthboundAbstractModule;
-import io.fd.honeycomb.northbound.restconf.JettyServerStarter.ServerInit;
+import io.fd.honeycomb.northbound.restconf.JettyServerStarter.RestconfJettyServer;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
 import org.opendaylight.netconf.sal.rest.api.RestConnector;
@@ -54,6 +54,6 @@ public class RestconfModule extends NorthboundAbstractModule<RestconfConfigurati
                 .toProvider(HttpsConnectorProvider.class)
                 .in(Singleton.class);
         bind(RestConnector.class).toProvider(RestconfProvider.class).in(Singleton.class);
-        bind(ServerInit.class).toProvider(JettyServerStarter.class).asEagerSingleton();
+        bind(RestconfJettyServer.class).toProvider(JettyServerStarter.class).asEagerSingleton();
     }
 }