From c1a6515fcfd3a9855eeca0e626e3b003842a52b7 Mon Sep 17 00:00:00 2001 From: macroscopic64 <macromohan64@gmail.com> Date: Sun, 22 Sep 2019 19:15:26 +0530 Subject: [PATCH 1/4] [BAEL-3288] - Graceful Shutdown of a Spring Boot Application --- .../GracefulShutdownApplication.java | 16 +++++++++ .../beans/LongRunningProcessBean.java | 36 +++++++++++++++++++ .../config/SpringConfiguration.java | 34 ++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java create mode 100644 spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java create mode 100644 spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java new file mode 100644 index 0000000000..b7a840b38c --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.gracefulshutdown; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@EnableAutoConfiguration +@ComponentScan(basePackages = {"com.baeldung.gracefulshutdown"}) +public class GracefulShutdownApplication { + + public static void main(String args[]) { + SpringApplication.run(GracefulShutdownApplication.class, args); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java new file mode 100644 index 0000000000..e21ddfe021 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java @@ -0,0 +1,36 @@ +package com.baeldung.gracefulshutdown.beans; + +import javax.annotation.PostConstruct; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.task.TaskExecutor; +import org.springframework.stereotype.Component; + +@Component +public class LongRunningProcessBean { + + private static final Logger LOG = LoggerFactory.getLogger(LongRunningProcessBean.class); + + @Autowired + private TaskExecutor taskExecutor; + + @PostConstruct + public void runTaskOnStartup() { + LOG.info("runTaskOnStartup entering"); + for (int i = 0; i < 3; i++) { + final int processNumber = i; + taskExecutor.execute(() -> { + try { + LOG.info("Long running process {} using threadpool started", processNumber); + Thread.sleep(60_000); + LOG.info("Long running process {} using threadpool completed", processNumber); + } catch (Exception e) { + LOG.error("Error while executing task", e); + } + }); + } + LOG.info("runTaskOnStartup exiting"); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java new file mode 100644 index 0000000000..1f27163215 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java @@ -0,0 +1,34 @@ +package com.baeldung.gracefulshutdown.config; + +import javax.annotation.PreDestroy; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@Configuration +@EnableScheduling +public class SpringConfiguration { + + private static final Logger LOG = LoggerFactory.getLogger(SpringConfiguration.class); + + @Bean + public TaskExecutor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + taskExecutor.setCorePoolSize(2); + taskExecutor.setMaxPoolSize(2); + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + taskExecutor.setAwaitTerminationSeconds(30); + taskExecutor.initialize(); + return taskExecutor; + } + + @PreDestroy + public void destroy() { + LOG.info("Shutdown initiated"); + } +} From 6f7676c739806e22b51785f699abf52a7c373191 Mon Sep 17 00:00:00 2001 From: macroscopic64 <macromohan64@gmail.com> Date: Thu, 26 Sep 2019 23:39:55 +0530 Subject: [PATCH 2/4] [BAEL-3288] - Graceful Shutdown of a Spring Boot Application --- .../gracefulshutdown/GracefulShutdownApplication.java | 6 +----- .../gracefulshutdown/config/SpringConfiguration.java | 2 -- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java index b7a840b38c..9cb226a49f 100644 --- a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java +++ b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java @@ -1,13 +1,9 @@ package com.baeldung.gracefulshutdown; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; -@SpringBootApplication -@EnableAutoConfiguration -@ComponentScan(basePackages = {"com.baeldung.gracefulshutdown"}) +@SpringBootApplication(scanBasePackages = {"com.baeldung.gracefulshutdown"}) public class GracefulShutdownApplication { public static void main(String args[]) { diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java index 1f27163215..b458f16206 100644 --- a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java +++ b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java @@ -7,11 +7,9 @@ import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.TaskExecutor; -import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration -@EnableScheduling public class SpringConfiguration { private static final Logger LOG = LoggerFactory.getLogger(SpringConfiguration.class); From 5621a6d8c5b527a607a261db4eea0d838393e2ab Mon Sep 17 00:00:00 2001 From: macroscopic64 <macromohan64@gmail.com> Date: Sat, 28 Sep 2019 11:38:39 +0530 Subject: [PATCH 3/4] [BAEL-3288] - Graceful Shutdown of a Spring Boot Application --- .../baeldung/gracefulshutdown/GracefulShutdownApplication.java | 0 .../baeldung/gracefulshutdown/beans/LongRunningProcessBean.java | 0 .../com/baeldung/gracefulshutdown/config/SpringConfiguration.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {spring-boot => spring-boot-ops-2}/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java (100%) rename {spring-boot => spring-boot-ops-2}/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java (100%) rename {spring-boot => spring-boot-ops-2}/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java (100%) diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java rename to spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java rename to spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java rename to spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java From d4b9f8a59a7a665941259e84a18cb7d1545f7ffa Mon Sep 17 00:00:00 2001 From: macroscopic64 <macromohan64@gmail.com> Date: Sat, 28 Sep 2019 11:40:44 +0530 Subject: [PATCH 4/4] [BAEL-3288] - Graceful Shutdown of a Spring Boot Application --- .../baeldung/gracefulshutdown/GracefulShutdownApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java index 9cb226a49f..dd0d0f920c 100644 --- a/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java +++ b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java @@ -3,7 +3,7 @@ package com.baeldung.gracefulshutdown; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication(scanBasePackages = {"com.baeldung.gracefulshutdown"}) +@SpringBootApplication public class GracefulShutdownApplication { public static void main(String args[]) {