后記
寫完篇文章后就把項目升級了該功能 ,但是上線后發現 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 單文件發布的情況下,有沒有相應的解決方案 ,不過沒有找到 ,這里拋磚引玉下 。