国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SpringBoot停服實踐

IT那活兒 / 2366人閱讀
SpringBoot停服實踐
[
一、介紹
]


當外部流量請求到服務端接口執行業務邏輯的時候,若服務端此時執行關機(kill),springboot 默認情況會直接關閉容器(tomcat等),導致此業務邏輯執行失敗。在一些業務場景下會出現數據不一致的情況,事務邏輯不會回滾。


在最新的springboot 2.3版本已內置此功能,不需要再自行擴展容器線程池來處理,目前springboot嵌入式支持的web服務器(Jetty、ReactorNetty、Tomcat和Undertow)以及反應式和基于Servlet的web應用程序都支持優雅停機功能。


此處支持的shutdown行為,我們看下源碼枚舉如下:

publicenumShutdown{

/**

*優雅停機(限期停機)

*/

GRACEFUL,


/**

*立即停機

*/

IMMEDIATE;


}

[
二、使用方式

]



在application.properties中添加以下配置

當server.shutdown=graceful啟用后,在web容器關閉時,web服務器將不再接收新請求,并將在緩沖期內等待活動請求完成。緩沖期timeout-per-shutdown-phase配置:默認時間為30S,意味著最大等待30S,超時后無論線程任務是否執行完畢都會停機處理,需要根據項目實際需要合理設置。


以上配置完畢,重新發布以后,服務端就支持優雅停服了。

[
三、觸發優雅停服
]

1、對進程PID執行kill-2 而不是kill-9

  kill-9,暴力美學強制殺死進程,不會執行ShutdownHook;但是kill-2相當于快捷鍵Ctrl+ C會觸發Java的ShutdownHook事件處理,進行優雅停機或者一些后置處理。可參考以下源碼:

@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端點實現優雅停機

前提為項目已加入actuator依賴,以及application.properties加入相關配置如圖


此時,POST請求/actuator/shutdown即可執行優雅關機。


源碼解析如下:

@Endpoint(id= "shutdown",enableByDefault = false)

publicclassShutdownEndpointimplementsApplicationContextAware{


@WriteOperation

publicMap shutdown(){

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來驗證下是否實現了優雅停服,下面是一個http測試接口,請求后返回一個json串。


@GetMapping("/test")
publicObject test(){
   List test = new ArrayList<>();
 
for(inti = 0; i < 5; i++) {
       String s = "test" +i;
       System.out.println(s);
       test.add(s);
     
try{
           Thread.sleep(1000);
       }
catch(InterruptedException e) {
           e.printStackTrace();
      }
   }
   return test;
}


啟動項目,正常訪問結果如下:


先看下未配置優雅停服前,在訪問接口過程中停機的結果。使用Ctrl+ C模擬在請求執行過程中停機,此時請求中斷,后端日志拋出異常。


配置好優雅停服后,再模擬上述情況。由下圖可以看到服務停止后,停服前的請求能正常返回,日志中也未拋出異常。

[
五、不同springboot嵌入式web容器優雅停機行為區別
]

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130099.html

相關文章

  • 趣米云:停服運營公告,請大家及時備份數據,請大家申請退款

    摘要:趣米云怎么樣趣米云是一家今年三月份新開的國人商家,就在此前還聲稱過了動蕩期,運營已經穩定。但是,趣米云商家突然發布了公告,決定停服停運的公告。趣米云怎么樣?趣米云是一家今年三月份新開的國人商家,就在此前還聲稱過了動蕩期,運營已經穩定。但是,趣米云商家突然發布了公告,決定停服停運的公告。就在不久前,商家開啟國慶優惠活動,還是原來的套餐,從30每月降到了26每月,估計低價也難得獲取到新的客戶,所...

    stefanieliang 評論0 收藏0
  • 立根鑄魂,麒麟信安攜手歐拉共推操作系統產業新發展

    摘要:作為在國產自主創新領域沉淀十余載的操作系統排頭兵,麒麟信安將攜手,立根鑄魂,共推操作系統產業新發展。 2021年11月9日-10日,主題為立根鑄魂,逐夢數字時代星辰...

    xavier 評論0 收藏0
  • SpringBoot熱部署加持

    摘要:概述進行的開發過程中,我們很多時候經常需要重啟服務器才能保證修改的源代碼文件或者一些諸如的配置文件以及一些靜態文件生效,這樣耗時又低效。 showImg(https://segmentfault.com/img/remote/1460000015363888); 概述 進行SpringBoot的Web開發過程中,我們很多時候經常需要重啟Web服務器才能保證修改的 源代碼文件、或者一些...

    ixlei 評論0 收藏0
  • Elastic Search搜索引擎在SpringBoot中的實踐

    摘要:注本文首發于公眾號,可長按或掃描下面的小心心來訂閱實驗環境版本版本首先當然需要安裝好環境,最好再安裝上可視化插件來便于我們直觀地查看數據。 showImg(https://segmentfault.com/img/remote/1460000015723674); 注: 本文首發于 My 公眾號 CodeSheep ,可 長按 或 掃描 下面的 小心心 來訂閱 ↓ ↓ ↓ showI...

    Me_Kun 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<