1. 程式人生 > 實用技巧 >SpringBoot 2.3.0 優雅關閉 shutdown graceful

SpringBoot 2.3.0 優雅關閉 shutdown graceful

緣起

最近看到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"
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 單檔案釋出的情況下,有沒有相應的解決方案 ,不過沒有找到 ,這裡拋磚引玉下 。