added in graceful shutdown to spring boot 91/101491/1
authorKalkere Ramesh, Sharan <sharan.kalkere.ramesh@att.com>
Mon, 10 Feb 2020 16:11:04 +0000 (11:11 -0500)
committerBenjamin, Max (mb388a) <mb388a@att.com>
Mon, 10 Feb 2020 16:11:04 +0000 (11:11 -0500)
added in graceful shutdown to spring boot
updated the poms to include catalina and upped fabric
added in eventlistener instead of application listener

Issue-ID: SO-2655
Signed-off-by: Benjamin, Max (mb388a) <mb388a@att.com>
Change-Id: I2d8674cc82a9167604b2d38a49bffba42cee32ff

common/pom.xml
common/src/main/java/org/onap/so/spring/GracefulShutdown.java [new file with mode: 0644]
common/src/main/java/org/onap/so/spring/GracefulShutdownBeans.java [new file with mode: 0644]

index 529841d..04deacf 100644 (file)
         </exclusion>
       </exclusions>
     </dependency>
+    <dependency>
+      <groupId>org.apache.tomcat</groupId>
+      <artifactId>tomcat-catalina</artifactId>
+      <version>9.0.30</version>
+    </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-ext</artifactId>
diff --git a/common/src/main/java/org/onap/so/spring/GracefulShutdown.java b/common/src/main/java/org/onap/so/spring/GracefulShutdown.java
new file mode 100644 (file)
index 0000000..60f5b07
--- /dev/null
@@ -0,0 +1,41 @@
+package org.onap.so.spring;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import org.apache.catalina.connector.Connector;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
+import org.springframework.context.event.ContextClosedEvent;
+import org.springframework.context.event.EventListener;
+
+public class GracefulShutdown implements TomcatConnectorCustomizer {
+
+    private static final Logger logger = LoggerFactory.getLogger(GracefulShutdown.class);
+
+    private volatile Connector connector;
+
+    @Override
+    public void customize(Connector connector) {
+        this.connector = connector;
+    }
+
+    @EventListener
+    public void handleClosedEvent(ContextClosedEvent event) {
+        this.connector.pause();
+        Executor executor = this.connector.getProtocolHandler().getExecutor();
+        if (executor instanceof ThreadPoolExecutor) {
+            try {
+                ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
+                threadPoolExecutor.shutdown();
+                if (!threadPoolExecutor.awaitTermination(30, TimeUnit.SECONDS)) {
+                    logger.warn("Tomcat thread pool did not shut down gracefully within "
+                            + "30 seconds. Proceeding with forceful shutdown");
+                }
+            } catch (InterruptedException ex) {
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
+}
diff --git a/common/src/main/java/org/onap/so/spring/GracefulShutdownBeans.java b/common/src/main/java/org/onap/so/spring/GracefulShutdownBeans.java
new file mode 100644 (file)
index 0000000..219c82f
--- /dev/null
@@ -0,0 +1,20 @@
+package org.onap.so.spring;
+
+import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+
+public class GracefulShutdownBeans {
+
+    @Bean
+    public GracefulShutdown gracefulShutdown() {
+        return new GracefulShutdown();
+    }
+
+    @Bean
+    public ConfigurableServletWebServerFactory webServerFactory(final GracefulShutdown gracefulShutdown) {
+        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
+        factory.addConnectorCustomizers(gracefulShutdown);
+        return factory;
+    }
+}