SpringBoot 2.3.0 優雅關閉 shutdown graceful


后記

寫完篇文章后就把項目升級了該功能 ,但是上線后發現 kill-2 xxx關閉不了,沒有反應 ,直接kill xxx 可以 。

緣起

最近看到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 這行消息。直到處理完來自tom的請求。

在它還沒完全關閉時,其實我也發了一些請求過來,都直接失敗了。

驗證還沒完全關閉時,啟動新版能否成功

寫了個shell腳本,用來關閉監聽8123的進程 ,然后立馬啟動新版程序;

#!/bin/sh
QYPATH="/home/testiron"
chmod 777 $QYPATH/fe.jar
# 關閉V1
VID=`ps -ef|grep java|grep 8123|awk '{print $2}'`
echo "\n關閉備用服務"
if [ -n "$VID" ]
then
    for i in $V7D;
    do kill -2 $i
    echo "kill $i done";
    done
fi
# 啟動V2
java -jar /home/testiron/fe.jar  v2 --server.port=8123  

發現是可以啟動的,不會出現端口占用的問題。

思考

因為以前寫.net ,所以去了解了下.net core 單文件發布的情況下,有沒有相應的解決方案 ,不過沒有找到 ,這里拋磚引玉下 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM