diff --git a/spring-boot-ops/pom.xml b/spring-boot-ops/pom.xml
index 57779c3f8e..9717a352d3 100644
--- a/spring-boot-ops/pom.xml
+++ b/spring-boot-ops/pom.xml
@@ -86,6 +86,12 @@
${jquery.version}
+
+ org.springframework.cloud
+ spring-cloud-context
+ ${springcloud.version}
+
+
@@ -153,6 +159,7 @@
2.2
18.0
3.1.7
+ 2.0.2.RELEASE
diff --git a/spring-boot-ops/src/main/java/com/baeldung/restart/Application.java b/spring-boot-ops/src/main/java/com/baeldung/restart/Application.java
new file mode 100644
index 0000000000..a6605a0baa
--- /dev/null
+++ b/spring-boot-ops/src/main/java/com/baeldung/restart/Application.java
@@ -0,0 +1,30 @@
+package com.baeldung.restart;
+
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.ConfigurableApplicationContext;
+
+@SpringBootApplication
+public class Application extends SpringBootServletInitializer {
+
+ private static ConfigurableApplicationContext context;
+
+ public static void main(String[] args) {
+ context = SpringApplication.run(Application.class, args);
+ }
+
+ public static void restart() {
+ ApplicationArguments args = context.getBean(ApplicationArguments.class);
+
+ Thread thread = new Thread(() -> {
+ context.close();
+ context = SpringApplication.run(Application.class, args.getSourceArgs());
+ });
+
+ thread.setDaemon(false);
+ thread.start();
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-ops/src/main/java/com/baeldung/restart/RestartController.java b/spring-boot-ops/src/main/java/com/baeldung/restart/RestartController.java
new file mode 100644
index 0000000000..68a8dc7073
--- /dev/null
+++ b/spring-boot-ops/src/main/java/com/baeldung/restart/RestartController.java
@@ -0,0 +1,23 @@
+package com.baeldung.restart;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class RestartController {
+
+ @Autowired
+ private RestartService restartService;
+
+ @PostMapping("/restart")
+ public void restart() {
+ Application.restart();
+ }
+
+ @PostMapping("/restartApp")
+ public void restartUsingActuator() {
+ restartService.restartApp();
+ }
+
+}
diff --git a/spring-boot-ops/src/main/java/com/baeldung/restart/RestartService.java b/spring-boot-ops/src/main/java/com/baeldung/restart/RestartService.java
new file mode 100644
index 0000000000..9883ec653b
--- /dev/null
+++ b/spring-boot-ops/src/main/java/com/baeldung/restart/RestartService.java
@@ -0,0 +1,17 @@
+package com.baeldung.restart;
+
+import org.springframework.stereotype.Service;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.context.restart.RestartEndpoint;
+
+@Service
+public class RestartService {
+
+ @Autowired
+ private RestartEndpoint restartEndpoint;
+
+ public void restartApp() {
+ restartEndpoint.restart();
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-ops/src/main/resources/application.properties b/spring-boot-ops/src/main/resources/application.properties
index a86bd3052e..27b7915cff 100644
--- a/spring-boot-ops/src/main/resources/application.properties
+++ b/spring-boot-ops/src/main/resources/application.properties
@@ -1,3 +1,7 @@
management.endpoints.web.exposure.include=*
management.metrics.enable.root=true
-management.metrics.enable.jvm=true
\ No newline at end of file
+management.metrics.enable.jvm=true
+management.endpoint.restart.enabled=true
+spring.datasource.jmx-enabled=false
+spring.main.allow-bean-definition-overriding=true
+management.endpoint.shutdown.enabled=true
\ No newline at end of file
diff --git a/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java b/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java
new file mode 100644
index 0000000000..14e80c3ac7
--- /dev/null
+++ b/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.restart;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+
+import java.time.Duration;
+
+public class RestartApplicationIntegrationTest {
+
+ private TestRestTemplate restTemplate = new TestRestTemplate();
+
+ @Test
+ public void givenBootApp_whenRestart_thenOk() throws Exception {
+ Application.main(new String[0]);
+
+ ResponseEntity response = restTemplate.exchange("http://localhost:8080/restart",
+ HttpMethod.POST, null, Object.class);
+
+ assertEquals(200, response.getStatusCode().value());
+ }
+
+ @Test
+ public void givenBootApp_whenRestartUsingActuator_thenOk() throws Exception {
+ Application.main(new String[] { "--server.port=8090" });
+
+ ResponseEntity response = restTemplate.exchange("http://localhost:8090/restartApp",
+ HttpMethod.POST, null, Object.class);
+
+ assertEquals(200, response.getStatusCode().value());
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-ops/src/test/resources/application.properties b/spring-boot-ops/src/test/resources/application.properties
index 2095a82a14..cf0f0ab74c 100644
--- a/spring-boot-ops/src/test/resources/application.properties
+++ b/spring-boot-ops/src/test/resources/application.properties
@@ -4,4 +4,9 @@ spring.mail.properties.mail.smtp.auth=false
management.endpoints.web.exposure.include=*
management.endpoint.shutdown.enabled=true
-endpoints.shutdown.enabled=true
\ No newline at end of file
+endpoints.shutdown.enabled=true
+
+management.endpoint.restart.enabled=true
+
+spring.main.allow-bean-definition-overriding=true
+spring.jmx.unique-names=true
\ No newline at end of file