首頁>技術>

第一種就是 SpringBoot 提供的actuator的功能,它可以執行shutdown, health, info等,預設情況下,actuator的shutdown是disable的,我們需要開啟它。首先引入acturator的maven依賴。

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-actuator</artifactId></dependency>

然後將shutdown節點開啟,也將/actuator/shutdown暴露web訪問也設定上,除了shutdown之外還有health, info的web訪問都開啟的話將management.endpoints.web.exposure.include=*就可以。將如下配置設定到application.properties裡邊。設定一下服務的埠號為3333。

server.port=3333management.endpoint.shutdown.enabled=truemanagement.endpoints.web.exposure.include=shutdown

在啟動類裡邊輸出一個啟動日誌,當工程啟動的時候,會看到啟動的輸出,接下來咱們執行停止命令。

curl -X POST http://localhost:3333/actuator/shutdown

第二種方法也比較簡單,獲取程式啟動時候的context,然後關閉主程式啟動時的context。這樣程式在關閉的時候也會呼叫PreDestroy註解。如下方法在程式啟動十秒後進行關閉。

/* method 2: use ctx.close to shutdown all application context */ConfigurableApplicationContext ctx = SpringApplication.run(ShutdowndemoApplication.class, args);try{  TimeUnit.SECONDS.sleep(10);} catch(InterruptedException e) {  e.printStackTrace();}ctx.close();

第三種方法,在SpringBoot啟動的時候將程序號寫入一個app.pid檔案,生成的路徑是可以指定的,可以通過命令 cat /Users/huangqingshi/app.id | xargs kill 命令直接停止服務,這個時候bean物件的PreDestroy方法也會呼叫的。這種方法大家使用的比較普遍。寫一個start.sh用於啟動springboot程式,然後寫一個停止程式將服務停止。

第四種方法,通過呼叫一個SpringApplication.exit()方法也可以退出程式,同時將生成一個退出碼,這個退出碼可以傳遞給所有的context。這個就是一個JVM的鉤子,通過呼叫這個方法的話會把所有PreDestroy的方法執行並停止,並且傳遞給具體的退出碼給所有Context。通過呼叫System.exit(exitCode)可以將這個錯誤碼也傳給JVM。程式執行完後最後會輸出:Process finished with exit code 0,給JVM一個SIGNAL。

第五種方法,自己寫一個Controller,然後將自己寫好的Controller獲取到程式的context,然後呼叫自己配置的Controller方法退出程式。通過呼叫自己寫的/shutDownContext方法關閉程式:curl -X POST http://localhost:3333/shutDownContext。

package com.hqs.springboot.shutdowndemo.controller;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublicclassShutDownControllerimplementsApplicationContextAware{privateApplicationContext context;@PostMapping("/shutDownContext")publicString shutDownContext() {ConfigurableApplicationContext ctx = (ConfigurableApplicationContext) context;ctx.close();return"context is shutdown";}@GetMapping("/")publicString getIndex() {return"OK";}@Overridepublicvoid setApplicationContext(ApplicationContext applicationContext) throwsBeansException{context = applicationContext;}}

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Kubernetes 零宕機滾動更新