欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot2.3新特性優(yōu)雅停機(jī)詳解

 更新時(shí)間:2020年05月18日 11:02:23   作者:冷冷  
這篇文章主要介紹了SpringBoot2.3新特性優(yōu)雅停機(jī)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

什么是優(yōu)雅停機(jī)

先來一段簡單的代碼,如下:

@RestController
public class DemoController {
 @GetMapping("/demo")
 public String demo() throws InterruptedException {
  // 模擬業(yè)務(wù)耗時(shí)處理流程
  Thread.sleep(20 * 1000L);
  return "hello";
 }
}

當(dāng)我們流量請求到此接口執(zhí)行業(yè)務(wù)邏輯的時(shí)候,若服務(wù)端此時(shí)執(zhí)行關(guān)機(jī) (kill),spring boot 默認(rèn)情況會(huì)直接關(guān)閉容器(tomcat 等),導(dǎo)致此業(yè)務(wù)邏輯執(zhí)行失敗。在一些業(yè)務(wù)場景下:會(huì)出現(xiàn)數(shù)據(jù)不一致的情況,事務(wù)邏輯不會(huì)回滾。

graceful shutdown

在最新的 spring boot 2.3 版本,內(nèi)置此功能,不需要再自行擴(kuò)展容器線程池來處理,
目前 spring boot 嵌入式支持的 web 服務(wù)器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及反應(yīng)式和基于 Servlet 的 web 應(yīng)用程序都支持優(yōu)雅停機(jī)功能。 我們來看下如何使用:

當(dāng)使用server.shutdown=graceful啟用時(shí),在 web 容器關(guān)閉時(shí),web 服務(wù)器將不再接收新請求,并將等待活動(dòng)請求完成的緩沖期。

配置體驗(yàn)

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

/**
 * Configuration for shutting down a {@link WebServer}.
 *
 * @author Andy Wilkinson
 * @since 2.3.0
 */
public enum Shutdown {

 /**
  * 優(yōu)雅停機(jī) (限期停機(jī))
  *
  */
 GRACEFUL,

 /**
  * 立即停機(jī)
  */
 IMMEDIATE;

}

緩沖期 timeout-per-shutdown-phase 配置

默認(rèn)時(shí)間為 30S, 意味著最大等待 30S,超時(shí)候無論線程任務(wù)是否執(zhí)行完畢都會(huì)停機(jī)處理,一定要合理合理設(shè)置。

效果體驗(yàn)

請求服務(wù)端接口

執(zhí)行關(guān)閉應(yīng)用

服務(wù)端接到關(guān)閉指令

2020-05-17 18:28:28.940 INFO 60341 --- [extShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2020-05-17 18:28:45.923 INFO 60341 --- [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown : Graceful shutdown complete

接口請求執(zhí)行完成

相關(guān)知識(shí)

關(guān)于此處執(zhí)行kill -2 而不是 kill -9

kill -2 相當(dāng)于快捷鍵 Ctrl + C 會(huì)觸發(fā) Java 的 ShutdownHook 事件處理(優(yōu)雅停機(jī)或者一些后置處理可參考以下源碼)

//ApplicationContext
 @Override
 public void registerShutdownHook() {
  if (this.shutdownHook == null) {
   // No shutdown hook registered yet.
   this.shutdownHook = new Thread(SHUTDOWN_HOOK_THREAD_NAME) {
    @Override
    public void run() {
     synchronized (startupShutdownMonitor) {
      doClose();
     }
    }
   };
   Runtime.getRuntime().addShutdownHook(this.shutdownHook);
  }
 }

kill -9,暴力美學(xué)強(qiáng)制殺死進(jìn)程,不會(huì)執(zhí)行 ShutdownHook

通過 actuate 端點(diǎn)實(shí)現(xiàn)優(yōu)雅停機(jī)

POST 請求 /actuator/shutdown 即可執(zhí)行優(yōu)雅關(guān)機(jī)。

源碼解析

@Endpoint(id = "shutdown", enableByDefault = false)
public class ShutdownEndpoint implements ApplicationContextAware {

 @WriteOperation
 public Map<String, String> shutdown() {
  Thread thread = new Thread(this::performShutdown);
  thread.setContextClassLoader(getClass().getClassLoader());
  thread.start();
 }

 private void performShutdown() {
  try {
   Thread.sleep(500L);
  }
  catch (InterruptedException ex) {
   Thread.currentThread().interrupt();
  }

  // 此處close 邏輯和上邊 shutdownhook 的處理一樣
  this.context.close();
 }
}

不同 web 容器優(yōu)雅停機(jī)行為區(qū)別

容器停機(jī)行為取決于具體的 web 容器行為

web 容器名稱 行為說明
tomcat 9.0.33+ 停止接收請求,客戶端新請求等待超時(shí)。
Reactor Netty 停止接收請求,客戶端新請求等待超時(shí)。
Undertow 停止接收請求,客戶端新請求直接返回 503。

到此這篇關(guān)于SpringBoot2.3新特性優(yōu)雅停機(jī)詳解的文章就介紹到這了,更多相關(guān)SpringBoot2.3新特性優(yōu)雅停機(jī)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Cloud 優(yōu)雅下線以及灰度發(fā)布實(shí)現(xiàn)

    Spring Cloud 優(yōu)雅下線以及灰度發(fā)布實(shí)現(xiàn)

    這篇文章主要介紹了Spring Cloud 優(yōu)雅下線以及灰度發(fā)布實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java Stream中自定義Collector實(shí)現(xiàn)復(fù)雜數(shù)據(jù)收集的方法

    Java Stream中自定義Collector實(shí)現(xiàn)復(fù)雜數(shù)據(jù)收集的方法

    Java Stream API中的Collector接口是一個(gè)強(qiáng)大的工具,它允許我們自定義數(shù)據(jù)收集、轉(zhuǎn)換和聚合的過程,,本文介紹了Java Stream中自定義Collector實(shí)現(xiàn)復(fù)雜數(shù)據(jù)收集方法,需要的朋友可以參考下
    2024-08-08
  • Java基礎(chǔ)知識(shí)之BufferedReader流的使用

    Java基礎(chǔ)知識(shí)之BufferedReader流的使用

    這篇文章主要介紹了Java基礎(chǔ)知識(shí)之BufferedReader流的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java動(dòng)態(tài)編譯執(zhí)行代碼示例

    Java動(dòng)態(tài)編譯執(zhí)行代碼示例

    這篇文章主要介紹了Java動(dòng)態(tài)編譯執(zhí)行代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Spring集成Mybatis過程詳細(xì)講解

    Spring集成Mybatis過程詳細(xì)講解

    mybatis-plus是一個(gè)Mybatis的增強(qiáng)工具,在Mybatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Mybatis-plus案例及用法實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • java中addMouseListener()方法的使用

    java中addMouseListener()方法的使用

    這篇文章主要介紹了java中addMouseListener()方法的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 三分鐘教你如何在IDEA中快速創(chuàng)建工程的方法

    三分鐘教你如何在IDEA中快速創(chuàng)建工程的方法

    這篇文章主要介紹了三分鐘教你如何在IDEA中快速創(chuàng)建工程的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 詳解SpringBoot中@SessionAttributes的使用

    詳解SpringBoot中@SessionAttributes的使用

    這篇文章主要通過示例為大家詳細(xì)介紹了SpringBoot中@SessionAttributes的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-07-07
  • SpringMVC教程之json交互使用詳解

    SpringMVC教程之json交互使用詳解

    本篇文章主要介紹了SpringMVC教程之json使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • spring boot如何指定啟動(dòng)端口

    spring boot如何指定啟動(dòng)端口

    這篇文章主要介紹了spring boot如何指定啟動(dòng)端口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評論