SpringBoot 2.3.0 優雅關閉 shutdown graceful
阿新 • • 發佈:2020-11-25
緣起
最近看到Springboot 新版有了 優雅關閉的新特性,於是學習驗證了下
學習
很簡單 ,在application.yml 中配置 server.shutdown=graceful即可 ,啟用該選項,web容器在關閉時會有始有終的處理完已經接收到的請求,注意,此時新的請求已經無法接收了。
驗證
建立demo程式
建立一個SpringBoot web專案 ,注意版本要在2.3.0及以上 ,啟動引數模擬版本號,
然後建立一個介面,接收一個字串引數 ,sleep30秒,最後返回版本號和使用者傳來的引數。
@RestController @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Resource private ApplicationArguments arguments; @RequestMapping("/show/{str}") public Object test(@PathVariable("str") String str) throws InterruptedException { List<String> version = arguments.getNonOptionArgs(); System.out.println("[start] - > " + version.get(0) +"--" +str); Thread.sleep(30 * 1000L); System.out.println("[end] - > " + version.get(0) + "--" + str); return version.get(0) +"--" +str; } }
打包啟動
打包好程式fe.jar ,使用命令啟動: java -jar fe.jar v1 --server.port=8123
然後用瀏覽器訪問這個介面 http://192.168.1.22:8123/show/tom
關閉它
在30秒之內關閉它 ,使用kill -2 xxx 命令 (注意這裡一定不能用-9,會直接少殺死它)。程式收到kill命令 ,控制檯立馬打印出了 [extShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
在它還沒完全關閉時,其實我也發了一些請求過來,都直接失敗了。
驗證還沒完全關閉時,啟動新版能否成功
寫了個shell指令碼,用來關閉監聽8123的程序 ,然後立馬啟動新版程式;
#!/bin/sh QYPATH="/home/testiron" chmod777$QYPATH/fe.jar #關閉V1 VID=`ps-ef|grepjava|grep8123|awk'{print$2}'` echo"\n關閉備用服務" if[-n"$VID"] then foriin$V7D; dokill-2$i echo"kill$idone"; done fi #啟動V2 java-jar/home/testiron/fe.jarv2--server.port=8123
發現是可以啟動的,不會出現端口占用的問題。
思考
因為以前寫.net ,所以去了解了下.net core 單檔案釋出的情況下,有沒有相應的解決方案 ,不過沒有找到 ,這裡拋磚引玉下 。