當外部流量請求到服務端接口執(zhí)行業(yè)務邏輯的時候,若服務端此時執(zhí)行關機(kill),springboot 默認情況會直接關閉容器(tomcat等),導致此業(yè)務邏輯執(zhí)行失敗。在一些業(yè)務場景下會出現(xiàn)數(shù)據(jù)不一致的情況,事務邏輯不會回滾。
在最新的springboot 2.3版本已內置此功能,不需要再自行擴展容器線程池來處理,目前springboot嵌入式支持的web服務器(Jetty、ReactorNetty、Tomcat和Undertow)以及反應式和基于Servlet的web應用程序都支持優(yōu)雅停機功能。
此處支持的shutdown行為,我們看下源碼枚舉如下:
publicenumShutdown{
/**
*優(yōu)雅停機(限期停機)
*/
GRACEFUL,
/**
*立即停機
*/
IMMEDIATE;
}
]
在application.properties中添加以下配置
當server.shutdown=graceful啟用后,在web容器關閉時,web服務器將不再接收新請求,并將在緩沖期內等待活動請求完成。緩沖期timeout-per-shutdown-phase配置:默認時間為30S,意味著最大等待30S,超時后無論線程任務是否執(zhí)行完畢都會停機處理,需要根據(jù)項目實際需要合理設置。
以上配置完畢,重新發(fā)布以后,服務端就支持優(yōu)雅停服了。
1、對進程PID執(zhí)行kill-2 而不是kill-9
kill-9,暴力美學強制殺死進程,不會執(zhí)行ShutdownHook;但是kill-2相當于快捷鍵Ctrl+ C會觸發(fā)Java的ShutdownHook事件處理,進行優(yōu)雅停機或者一些后置處理。可參考以下源碼:
@Override
publicvoidregisterShutdownHook(){
if(this.shutdownHook== null){
//No shutdown hook registered yet.
this.shutdownHook= newThread(SHUTDOWN_HOOK_THREAD_NAME) {
@Override
publicvoidrun(){
synchronized(startupShutdownMonitor) {
doClose();
}
}
};
Runtime.getRuntime().addShutdownHook(this.shutdownHook);
}
}
2、通過actuator端點實現(xiàn)優(yōu)雅停機
前提為項目已加入actuator依賴,以及application.properties加入相關配置如圖
此時,POST請求/actuator/shutdown即可執(zhí)行優(yōu)雅關機。
源碼解析如下:
@Endpoint(id= "shutdown",enableByDefault = false)
publicclassShutdownEndpointimplementsApplicationContextAware{
@WriteOperation
publicMap
Threadthread = newThread(this::performShutdown);
thread.setContextClassLoader(getClass().getClassLoader());
thread.start();
}
privatevoidperformShutdown(){
try{
Thread.sleep(500L);
}
catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
//此處close邏輯和上邊shutdownhook的處理一樣
this.context.close();
}
}
我們通過一個demo來驗證下是否實現(xiàn)了優(yōu)雅停服,下面是一個http測試接口,請求后返回一個json串。
@GetMapping("/test")
publicObject test(){
List
String s = "test" +i;
System.out.println(s);
test.add(s);
try{
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
return test;
}
啟動項目,正常訪問結果如下:
先看下未配置優(yōu)雅停服前,在訪問接口過程中停機的結果。使用Ctrl+ C模擬在請求執(zhí)行過程中停機,此時請求中斷,后端日志拋出異常。
配置好優(yōu)雅停服后,再模擬上述情況。由下圖可以看到服務停止后,停服前的請求能正常返回,日志中也未拋出異常。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/130099.html
摘要:趣米云怎么樣趣米云是一家今年三月份新開的國人商家,就在此前還聲稱過了動蕩期,運營已經穩(wěn)定。但是,趣米云商家突然發(fā)布了公告,決定停服停運的公告。趣米云怎么樣?趣米云是一家今年三月份新開的國人商家,就在此前還聲稱過了動蕩期,運營已經穩(wěn)定。但是,趣米云商家突然發(fā)布了公告,決定停服停運的公告。就在不久前,商家開啟國慶優(yōu)惠活動,還是原來的套餐,從30每月降到了26每月,估計低價也難得獲取到新的客戶,所...
摘要:作為在國產自主創(chuàng)新領域沉淀十余載的操作系統(tǒng)排頭兵,麒麟信安將攜手,立根鑄魂,共推操作系統(tǒng)產業(yè)新發(fā)展。 2021年11月9日-10日,主題為立根鑄魂,逐夢數(shù)字時代星辰...
摘要:概述進行的開發(fā)過程中,我們很多時候經常需要重啟服務器才能保證修改的源代碼文件或者一些諸如的配置文件以及一些靜態(tài)文件生效,這樣耗時又低效。 showImg(https://segmentfault.com/img/remote/1460000015363888); 概述 進行SpringBoot的Web開發(fā)過程中,我們很多時候經常需要重啟Web服務器才能保證修改的 源代碼文件、或者一些...
摘要:注本文首發(fā)于公眾號,可長按或掃描下面的小心心來訂閱實驗環(huán)境版本版本首先當然需要安裝好環(huán)境,最好再安裝上可視化插件來便于我們直觀地查看數(shù)據(jù)。 showImg(https://segmentfault.com/img/remote/1460000015723674); 注: 本文首發(fā)于 My 公眾號 CodeSheep ,可 長按 或 掃描 下面的 小心心 來訂閱 ↓ ↓ ↓ showI...
閱讀 1356·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1906·2023-01-11 13:20
閱讀 4165·2023-01-11 13:20
閱讀 2757·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3671·2023-01-11 13:20