最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你了解SpringBoot的停機(jī)方式

 更新時(shí)間:2023年02月14日 10:50:14   作者:喝酸奶要舔蓋兒  
停機(jī)簡(jiǎn)單的說(shuō),就是向應(yīng)用進(jìn)程發(fā)出停止指令之后,能保證正在執(zhí)行的業(yè)務(wù)操作不受影響,直到操作運(yùn)行完畢之后再停止服務(wù)。本文就來(lái)和大家聊聊Springboot的停機(jī)方式與停機(jī)處理

1. 介紹

簡(jiǎn)單的說(shuō),就是向應(yīng)用進(jìn)程發(fā)出停止指令之后,能保證正在執(zhí)行的業(yè)務(wù)操作不受影響,直到操作運(yùn)行完畢之后再停止服務(wù)。應(yīng)用程序接收到停止指令之后,會(huì)進(jìn)行如下操作:

1.停止接收新的訪問(wèn)請(qǐng)求

2.正在處理的請(qǐng)求,等待請(qǐng)求處理完畢;對(duì)于內(nèi)部正在執(zhí)行的其他任務(wù),比如定時(shí)任務(wù)、mq 消費(fèi)等等,也要等當(dāng)前正在執(zhí)行的任務(wù)執(zhí)行完畢,并且不再啟動(dòng)新的任務(wù)

3.當(dāng)應(yīng)用準(zhǔn)備關(guān)閉的時(shí)候,按需向外發(fā)出信號(hào),告知其他應(yīng)用服務(wù)準(zhǔn)備接手,以保證服務(wù)高可用

如果暴力的關(guān)閉應(yīng)用程序,比如通過(guò)kill -9 命令強(qiáng)制直接關(guān)閉應(yīng)用程序進(jìn)程,可能會(huì)導(dǎo)致正在執(zhí)行的任務(wù)數(shù)據(jù)丟失或者錯(cuò)亂,也可能會(huì)導(dǎo)致任務(wù)所持有的全局資源等不到釋放,比如當(dāng)前任務(wù)持有 redis 的鎖,并且沒(méi)有設(shè)置過(guò)期時(shí)間,當(dāng)任務(wù)突然被終止并且沒(méi)有主動(dòng)釋放鎖,會(huì)導(dǎo)致其他進(jìn)程因無(wú)法獲取鎖而不能處理業(yè)務(wù)。

那么如何在不影響正在執(zhí)行的業(yè)務(wù)的情況下,將應(yīng)用程序安全的進(jìn)行關(guān)閉呢?

2. 停機(jī)方式

2.1 使用ApplicationContext的close方法關(guān)閉服務(wù)

可以使用ApplicationContext的close方法來(lái)關(guān)停服務(wù),他會(huì)自動(dòng)銷毀bean對(duì)象并關(guān)停服務(wù)

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
      ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

      try {
         TimeUnit.SECONDS.sleep(10);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      //啟動(dòng)10秒以后,自動(dòng)關(guān)閉
      context.close();
    }
}

2.2 使用SpringApplication的exit方法關(guān)閉服務(wù)

通過(guò)調(diào)用一個(gè)SpringApplication.exit()方法也可以安全的退出程序,同時(shí)會(huì)返回一個(gè)退出碼,這個(gè)退出碼可以傳遞給所有的context,最后通過(guò)調(diào)用System.exit()可以將這個(gè)錯(cuò)誤碼也傳給JVM。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //5秒后,關(guān)閉服務(wù)
        exitApplication(context);
    }

    public static void exitApplication(ConfigurableApplicationContext context) {
     //獲取退出碼
        int exitCode = SpringApplication.exit(context, (ExitCodeGenerator) () -> 0);
        //退出碼傳遞給jvm,安全退出程序
        System.exit(exitCode);
    }

}

3. 停機(jī)處理

3.1 DisposableBean

SpringBoot 官方文檔上,已經(jīng)告訴開(kāi)發(fā)者只需要實(shí)現(xiàn)特定接口即可監(jiān)聽(tīng)到項(xiàng)目啟動(dòng)成功與關(guān)閉時(shí)的事件,相關(guān)接口如下:

CommandLineRunner接口:當(dāng)應(yīng)用啟動(dòng)成功后但在開(kāi)始接受流量之前,會(huì)回調(diào)此接口的實(shí)現(xiàn)類,也可以實(shí)現(xiàn)ApplicationRunner接口,工作的方式與CommandLineRunner與之類似

DisposableBean接口:當(dāng)應(yīng)用正要被銷毀前,會(huì)回調(diào)此接口的實(shí)現(xiàn)類,也可以使用@PreDestroy注解,被標(biāo)記的方法也會(huì)被調(diào)用

基于此流程,我們可以創(chuàng)建一個(gè)服務(wù)監(jiān)聽(tīng)類,用于監(jiān)聽(tīng)到項(xiàng)目啟動(dòng)成功與關(guān)閉時(shí)的回調(diào)服務(wù),示例代碼如下:

@Component
public class AppListener implements CommandLineRunner, DisposableBean {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("應(yīng)用啟動(dòng)成功,預(yù)加載相關(guān)數(shù)據(jù)");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("應(yīng)用正在關(guān)閉,清理相關(guān)數(shù)據(jù)");
    }

}

3.2 PreDestroy

上文中,我們提到了實(shí)現(xiàn)DisposableBean接口,可以監(jiān)聽(tīng)?wèi)?yīng)用關(guān)閉前的回調(diào)處理,其實(shí)在自定義的方法上加@PreDestroy注解,也可以實(shí)現(xiàn)相同的效果。

@Component
public class AppDestroyConfig {

    @PreDestroy
    public void PreDestroy(){
        System.out.println("應(yīng)用程序正在關(guān)閉。。。");
    }
}

3.3 ApplicationListener

如果有些服務(wù),比如定時(shí)任務(wù),我們想在SpringBoot關(guān)閉數(shù)據(jù)源連接池之前,將其關(guān)閉,可以通過(guò)實(shí)現(xiàn)ApplicationListener接口,監(jiān)聽(tīng)bean對(duì)象的變化情況,在bean對(duì)象銷毀之前,執(zhí)行相關(guān)的關(guān)閉任務(wù)。

@Component
public class JobTaskListener implements ApplicationListener {

    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        // 在spring bean容器銷毀之前執(zhí)行的事件,防止數(shù)據(jù)庫(kù)連接池在任務(wù)終止前銷毀
        if (applicationEvent instanceof ContextClosedEvent) {
            System.out.println("關(guān)閉相關(guān)的定時(shí)任務(wù)");
        }
    }
}

到此這篇關(guān)于一文帶你了解SpringBoot的停機(jī)方式的文章就介紹到這了,更多相關(guān)SpringBoot停機(jī)方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java自帶的加密類MessageDigest類代碼示例

    Java自帶的加密類MessageDigest類代碼示例

    這篇文章主要介紹了Java自帶的加密類MessageDigest類代碼示例,分享了常見(jiàn)的三種加密方式代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 關(guān)于Spring?Cloud的熔斷器監(jiān)控問(wèn)題

    關(guān)于Spring?Cloud的熔斷器監(jiān)控問(wèn)題

    Turbine是一個(gè)聚合Hystrix監(jiān)控?cái)?shù)據(jù)的工具,它可將所有相關(guān)/hystrix.stream端點(diǎn)的數(shù)據(jù)聚合到一個(gè)組合的/turbine.stream中,從而讓集群的監(jiān)控更加方便,接下來(lái)通過(guò)本文給大家介紹Spring?Cloud的熔斷器監(jiān)控,感興趣的朋友一起看看吧
    2022-01-01
  • java實(shí)現(xiàn)文件復(fù)制、剪切文件和刪除示例

    java實(shí)現(xiàn)文件復(fù)制、剪切文件和刪除示例

    這篇文章主要介紹了java實(shí)現(xiàn)文件復(fù)制、剪切文件和刪除示例,需要的朋友可以參考下
    2014-04-04
  • Mybatis報(bào)錯(cuò)mapkey is required問(wèn)題及解決

    Mybatis報(bào)錯(cuò)mapkey is required問(wèn)題及解決

    這篇文章主要介紹了Mybatis報(bào)錯(cuò)mapkey is required問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • java實(shí)現(xiàn)線程調(diào)度器和時(shí)間分片

    java實(shí)現(xiàn)線程調(diào)度器和時(shí)間分片

    線程調(diào)度器和時(shí)間分片是多線程編程和操作系統(tǒng)設(shè)計(jì)中的核心概念,本文主要介紹了java實(shí)現(xiàn)線程調(diào)度器和時(shí)間分片,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • Java中連接數(shù)據(jù)庫(kù)方式詳細(xì)步驟記錄

    Java中連接數(shù)據(jù)庫(kù)方式詳細(xì)步驟記錄

    這篇文章主要介紹了Java中連接數(shù)據(jù)庫(kù)方式的詳細(xì)步驟,包括添加依賴、建立連接、執(zhí)行SQL語(yǔ)句、處理結(jié)果集和關(guān)閉連接,還討論了數(shù)據(jù)庫(kù)連接池的使用,需要的朋友可以參考下
    2025-01-01
  • 二維碼生成Java實(shí)現(xiàn)代碼

    二維碼生成Java實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了二維碼生成Java實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Spring Security異步無(wú)法獲取用戶認(rèn)證信息的解決方法

    Spring Security異步無(wú)法獲取用戶認(rèn)證信息的解決方法

    最近使用 Springboot 中 @Async 注解異步調(diào)用方法時(shí),發(fā)現(xiàn)無(wú)法獲取到用戶認(rèn)證信息,本文小編給大家介紹了Spring Security異步無(wú)法獲取用戶認(rèn)證信息的原因和解決方法,并通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • Java實(shí)現(xiàn)冒泡排序算法及對(duì)其的簡(jiǎn)單優(yōu)化示例

    Java實(shí)現(xiàn)冒泡排序算法及對(duì)其的簡(jiǎn)單優(yōu)化示例

    這篇文章主要介紹了Java實(shí)現(xiàn)冒泡排序算法及對(duì)其的簡(jiǎn)單優(yōu)化示例,冒泡排序的最差時(shí)間復(fù)雜度為O(n^2),最優(yōu)時(shí)間復(fù)雜度為O(n),存在優(yōu)化的余地,需要的朋友可以參考下
    2016-05-05
  • JSON在Java中的使用方法實(shí)例

    JSON在Java中的使用方法實(shí)例

    對(duì)于java來(lái)說(shuō),json的對(duì)象也是分為JSONObject和JSONArray這兩種,每種對(duì)象的操作方式不一樣哦,下面這篇文章主要給大家介紹了關(guān)于JSON在Java中使用的相關(guān)資料,需要的朋友可以參考下
    2023-03-03

最新評(píng)論

清涧县| 济南市| 喀喇沁旗| 屏南县| 天津市| 聂荣县| 会理县| 江口县| 苏尼特左旗| 尚义县| 霸州市| 漠河县| 长汀县| 峡江县| 广宗县| 怀来县| 五指山市| 神木县| 武穴市| 富民县| 江源县| 云龙县| 成武县| 古浪县| 乐业县| 仙居县| 衡阳县| 嵊泗县| 通山县| 梧州市| 蒙阴县| 黄大仙区| 驻马店市| 隆林| 廉江市| 抚松县| 临沧市| 西藏| 汤阴县| 岳普湖县| 西昌市|