diff --git a/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/GovVoiceApplication.java b/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/GovVoiceApplication.java index db1073c8e8..fadb32d058 100644 --- a/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/GovVoiceApplication.java +++ b/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/GovVoiceApplication.java @@ -1,13 +1,17 @@ package com.epmet; +import com.epmet.config.GracefulShutdownTomcat; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableAsync; /** - * * @author Mark sunlightcs@gmail.com * @since 1.0.0 */ @@ -16,7 +20,17 @@ import org.springframework.scheduling.annotation.EnableAsync; @EnableFeignClients @EnableAsync public class GovVoiceApplication { - public static void main(String[] args) { - SpringApplication.run(GovVoiceApplication.class, args); - } + @Autowired + private GracefulShutdownTomcat gracefulShutdownTomcat; + + public static void main(String[] args) { + SpringApplication.run(GovVoiceApplication.class, args); + } + + @Bean + public ServletWebServerFactory servletContainer() { + TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(); + tomcat.addConnectorCustomizers(gracefulShutdownTomcat); + return tomcat; + } } diff --git a/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/config/GracefulShutdownTomcat.java b/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/config/GracefulShutdownTomcat.java new file mode 100644 index 0000000000..4cc1d8f56a --- /dev/null +++ b/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/config/GracefulShutdownTomcat.java @@ -0,0 +1,37 @@ +package com.epmet.config; + +import org.apache.catalina.connector.Connector; +import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextClosedEvent; +import org.springframework.stereotype.Component; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +@Component +public class GracefulShutdownTomcat implements TomcatConnectorCustomizer, ApplicationListener { + private volatile Connector connector; + private final int waitTime = 30; + @Override + public void customize(Connector connector) { + this.connector = connector; + } + @Override + public void onApplicationEvent(ContextClosedEvent contextClosedEvent) { + this.connector.pause(); + Executor executor = this.connector.getProtocolHandler().getExecutor(); + if (executor instanceof ThreadPoolExecutor) { + try { + ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor; + threadPoolExecutor.shutdown(); + if (!threadPoolExecutor.awaitTermination(waitTime, TimeUnit.SECONDS)) { + System.out.println("Tomcat thread pool did not shut down gracefully within " + waitTime + " seconds. Proceeding with forceful shutdown"); + } + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } + } +} \ No newline at end of file