javascript
Shutdown SpringBoot App
文章目錄
- Shutdown Endpoint
- close Application Context
- 退出SpringApplication
- 從外部程序kill App
Shutdown SpringBoot App
Spring Boot使用ApplicationContext來創建,初始化和銷毀所用的bean。本文將會講解如何shut down一個spring boot應用程序。
Shutdown Endpoint
Spring Boot actuator自帶了shutdown的endpoint。首先我們添加pom依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>接下來我們需要開啟shutdown的配置:
management.endpoints.web.exposure.include=* management.endpoint.shutdown.enabled=true上面的配置對外暴露了 /shutdown 接口。我們可以直接這樣調用:
curl -X POST localhost:8080/actuator/shutdownclose Application Context
我們也可以直接調用Application Context的close() 方法來關閉Application Context。
@SpringBootApplication public class ConfigurableApp {public static void main(String[] args) {ConfigurableApplicationContext ctx = newSpringApplicationBuilder(ConfigurableApp.class).web(WebApplicationType.NONE).run();System.out.println("Spring Boot application started");ctx.getBean(TerminateBean.class);ctx.close();} }為了驗證App是否被關閉,我們可以在TerminateBean中添加@PreDestroy來監測App是否被關閉:
@Component public class TerminateBean {@PreDestroypublic void onDestroy() throws Exception {System.out.println("Spring Container is destroyed!");} }這是程序的輸出:
2020-02-03 23:12:08.583 INFO 30527 --- [ main] com.flydean.ConfigurableApp : Started ConfigurableApp in 2.922 seconds (JVM running for 3.559) Spring Boot application started Spring Container is destroyed!還有一種辦法就是暴露close接口如下所示:
@RestController public class ShutdownController implements ApplicationContextAware {private ApplicationContext context;@PostMapping("/shutdownContext")public void shutdownContext() {((ConfigurableApplicationContext) context).close();}@Overridepublic void setApplicationContext(ApplicationContext ctx) throws BeansException {this.context = ctx;} }這樣我們就可以通過/shutdownContext接口來關閉ApplicationContext。
退出SpringApplication
上篇文章我們講過可以通過實現ExitCodeGenerator 接口來返回特定的exit code:
@SpringBootApplication public class ExitCodeApp implements ExitCodeGenerator {public static void main(String[] args) {System.exit(SpringApplication.exit(SpringApplication.run(ExitCodeApp.class, args)));}@Overridepublic int getExitCode() {return 11;} }從外部程序kill App
熟悉shell的同學都知道如果想在外部kill一個程序,需要知道該App的pid,Spring Boot也可以很方便的生成pid:
@SpringBootApplication public class KillApp {public static void main(String[] args) {SpringApplicationBuilder app = new SpringApplicationBuilder(KillApp.class).web(WebApplicationType.NONE);app.build().addListeners(new ApplicationPidFileWriter("./bin/shutdown.pid"));app.run();} }上面的程序將會在./bin/shutdown.pid生成應用程序的pid,供shell使用。
我們可以這樣使用:
kill $(cat ./bin/shutdown.pid)本文的例子可以參考 https://github.com/ddean2009/learn-springboot2/tree/master/springboot-shutdown
更多精彩內容且看:
- 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
- Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
- java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程
更多教程請參考 flydean的博客
總結
以上是生活随笔為你收集整理的Shutdown SpringBoot App的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot的exit cod
- 下一篇: Spring boot 自定义banne