精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Boot 實現(xiàn)優(yōu)雅停機的正確姿勢!

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

一、背景介紹

什么叫優(yōu)雅停機?

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

  • 1.停止接收新的訪問請求
  • 2.正在處理的請求,等待請求處理完畢;對于內(nèi)部正在執(zhí)行的其他任務(wù),比如定時任務(wù)、mq 消費等等,也要等當前正在執(zhí)行的任務(wù)執(zhí)行完畢,并且不再啟動新的任務(wù)
  • 3.當應(yīng)用準備關(guān)閉的時候,按需向外發(fā)出信號,告知其他應(yīng)用服務(wù)準備接手,以保證服務(wù)高可用

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

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

二、方案實踐

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

  • CommandLineRunner接口:當應(yīng)用啟動成功后但在開始接受流量之前,會回調(diào)此接口的實現(xiàn)類,也可以實現(xiàn)ApplicationRunner接口,工作的方式與CommandLineRunner與之類似
  • DisposableBean接口:當應(yīng)用正要被銷毀前,會回調(diào)此接口的實現(xiàn)類,也可以使用@PreDestroy注解,被標記的方法也會被調(diào)用

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

@Component
public class AppListener implements CommandLineRunner, DisposableBean {

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

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

}

每一個SpringApplication在啟用的時候,都會向 JVM 注冊一個關(guān)閉鉤子shutdown hook,以確保ApplicationContext在退出的時候,通過這個勾子通知 JVM,實現(xiàn)服務(wù)正常的關(guān)閉,以下介紹的所有關(guān)閉服務(wù)的方法,都是基于這一原理進行實現(xiàn)的。

2.1方法一:通過Actuator的Endpoint機制關(guān)閉服務(wù)

使用此方法,需要先添加spring-boot-starter-actuator監(jiān)控服務(wù)依賴包,

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

默認配置下,shutdown端點是關(guān)閉的,需要在application.properties里配置里面開啟:

management.endpoint.shutdown.enabled=true

雖然Actuator的端點,支持通過JMX或HTTP進行遠程訪問。而shutdown默認配置下是不支持HTTP進行Web訪問的,所以使用HTTP請求進行關(guān)閉時的配置,也需要開啟:

management.endpoints.web.exposure.include=shutdown

最后將SpringBoot服務(wù)啟動之后,使用POST請求類型,調(diào)用以下接口,即可實現(xiàn)關(guān)閉服務(wù)!

http://127.0.0.1:8080/actuator/shutdown

圖片圖片

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

如果你不想添加spring-boot-starter-actuator監(jiān)控服務(wù)依賴包來關(guān)停服務(wù),也可以使用ApplicationContext的close方法來關(guān)停服務(wù),他會自動銷毀bean對象并關(guān)停服務(wù)。

只需要在應(yīng)用啟用的時候,獲取ApplicationContext對象,然后在相關(guān)的位置調(diào)用close方法,就可以關(guān)閉服務(wù)。

示例代碼如下:

@SpringBootApplication
publicclass Application {

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

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

當然我們也可以自己寫一個Controller,獲取對應(yīng)的ApplicationContext對象,通過api操作調(diào)用close方法關(guān)停服務(wù),示例代碼如下:

@RestController
publicclass ShutdownController implements ApplicationContextAware {

    private ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;
    }

    /**
     * 關(guān)閉服務(wù)
     */
    @GetMapping("/shutdown")
    public void shutdownContext() {
        ((ConfigurableApplicationContext) context).close();
    }
}

2.3方法三:監(jiān)聽服務(wù)pid,通過kill方式關(guān)閉服務(wù)

通過api方式來關(guān)停服務(wù),在很多人看來并不安全,因為一旦接口泄漏了,意味著用戶可以隨便請求這個接口來關(guān)閉服務(wù),其影響不言而喻,因此很多人建議在服務(wù)端,通過其他的方式來關(guān)閉服務(wù),比如通過進程命令方式來關(guān)停。

在springboot啟動的時候?qū)?yīng)用進程 ID 寫入一個app.pid文件,生成的路徑可以指定,然后通過腳本命令方式來關(guān)閉服務(wù)。

啟動示例代碼如下:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        application.addListeners(new ApplicationPidFileWriter("/home/app/project1/app.pid"));
        application.run();
    }
}

通過如下命令方式,可以安全的關(guān)閉服務(wù)。

cat /home/app/project1/app.pid | xargs kill

這種方式,也是目前在linux操作系統(tǒng)中,使用較為普遍的一種解決方案,區(qū)別在于實現(xiàn)的方式可能不同,有的不用寫文件,通過其他方式來獲取應(yīng)用進程 ID。

如果使用kill -9 <pid>的方式關(guān)閉服務(wù),服務(wù)的監(jiān)聽器不會收到任何消息,類似于直接強殺應(yīng)用進程,此方法不可?。?/p>

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

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

示例代碼如下:

@SpringBootApplication
publicclass 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);
    }

}

三、其他監(jiān)聽介紹

3.1ApplicationListener

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

示例代碼如下:

@Component
public class JobTaskListener implements ApplicationListener {

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

3.2PreDestroy

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

示例代碼如下:

@Component
public class AppDestroyConfig {

    @PreDestroy
    public void PreDestroy(){
        System.out.println("應(yīng)用程序正在關(guān)閉。。。");
    }
}
責任編輯:武曉燕 來源: 潘志的技術(shù)筆記
相關(guān)推薦

2023-01-30 07:41:43

2021-09-15 16:20:02

Spring BootFilterJava

2024-08-12 10:13:01

2024-08-02 09:15:22

Spring捕捉格式

2024-08-01 09:10:03

2025-02-12 08:07:40

2021-05-08 08:33:00

Rocketmq日志數(shù)據(jù)源

2025-01-17 09:11:51

2022-06-04 12:25:10

解密加密過濾器

2021-03-09 13:18:53

加密解密參數(shù)

2018-11-01 13:38:51

Java中斷停止

2025-08-04 01:55:00

2025-02-27 08:30:10

2025-07-29 08:25:57

2020-08-05 08:30:25

Spring BootJavaSE代碼

2017-02-23 15:37:44

OptionObject容器

2016-05-09 10:41:03

算法分析開發(fā)

2018-01-11 15:31:39

命令Linux關(guān)機

2024-12-03 10:59:36

2017-07-10 13:09:45

前端Flexbox
點贊
收藏

51CTO技術(shù)棧公眾號

国产在线日韩在线| 日韩中文娱乐网| 日本xxxxxxx免费视频| 超碰免费97在线观看| 国产精品影视在线| 日本午夜精品理论片a级appf发布| 日本女人性生活视频| 粉嫩av一区二区| 欧美日韩一区高清| 欧美日韩一道本| 超碰在线观看免费| 久久毛片高清国产| ts人妖另类在线| 一区二区自拍偷拍| 一本一本久久| 欧美精品在线观看| gv天堂gv无码男同在线观看| 国产肉体xxxx裸体784大胆| a国产在线视频| 国产精品高潮呻吟久久| 国产午夜精品一区| av免费观看在线| 热久久免费视频| 26uuu另类亚洲欧美日本一| 日韩国产第一页| 青青草原在线亚洲| 欧美tickling网站挠脚心| 污污的网站18| 久久久一本精品| 五月婷婷综合网| 日韩一级特黄毛片| www.99re7| 国产日韩欧美制服另类| 欧洲精品在线视频| 国产一级片免费观看| 爽成人777777婷婷| 亚洲天堂成人在线视频| 日本黄色免费观看| 成功精品影院| 精品国产乱码久久久久久老虎 | 国内久久视频| 精品国产欧美一区二区五十路| 色噜噜日韩精品欧美一区二区| 中文无码日韩欧| 日韩欧美一级二级三级 | 丰满亚洲少妇av| 91亚洲va在线va天堂va国| 真实新婚偷拍xxxxx| 老牛影视一区二区三区| 日本国产欧美一区二区三区| 国产微拍精品一区| 亚洲一区二区三区高清| 91精品国产乱码久久久久久久久 | 国产亚洲一区在线| 2019中文字幕在线观看| 国产成人亚洲欧洲在线| 午夜在线视频观看日韩17c| 欧美一级视频一区二区| 四虎成人在线观看| 日韩精品视频网| 国产有码在线一区二区视频| 国产精品色综合| 国产美女精品人人做人人爽| 97se国产在线视频| 日韩一级片免费在线观看| 成人av手机在线观看| 精品久久久久久综合日本| 欧美巨乳在线| 国产精品亲子伦对白| 成人手机视频在线| 国产乱码在线| 色94色欧美sute亚洲线路一久| 亚洲一二三区av| 高清在线一区二区| 亚洲第一av在线| 国产 欧美 在线| 四季av在线一区二区三区| 久久久国产精品一区| 精品无码人妻一区二区三区| 国产精品一二| 国产在线精品成人一区二区三区| 99精品在线看| wwww国产精品欧美| 一本一道久久a久久精品综合| xvideos国产在线视频| 香蕉久久一区二区不卡无毒影院| 免费高清在线观看免费| 欧美黄色网络| 亚洲精品97久久| 美国黄色特级片| 亚洲东热激情| 国产精品视频专区| 蜜臀av中文字幕| 国产农村妇女毛片精品久久麻豆 | 亚洲另类自拍| 国产欧美一区二区三区视频| www天堂在线| 久久久久国产精品麻豆| 穿情趣内衣被c到高潮视频| 丁香花电影在线观看完整版| 欧美制服丝袜第一页| 91看片就是不一样| 99re6热只有精品免费观看| 国产亚洲xxx| 国产乡下妇女做爰毛片| 蜜臀av一区二区在线免费观看| av在线不卡观看| yiren22综合网成人| 亚洲成人综合视频| 亚洲免费黄色网| 国产成人3p视频免费观看| 欧美理论片在线观看| 国产三级理论片| 97久久精品人人做人人爽| 大桥未久一区二区三区| 日本一区二区电影| 精品小视频在线| 精品久久免费视频| 国产乱码一区二区三区| 婷婷四房综合激情五月| 水蜜桃在线视频| 精品免费日韩av| 亚洲一级生活片| 蜜桃视频一区二区三区| 免费99视频| 三级在线观看视频| 亚洲精品在线一区二区| 妺妺窝人体色www聚色窝仙踪| 免费xxxx性欧美18vr| 日本在线观看不卡| sese综合| 亚洲色图综合网| 极品国产91在线网站| 97久久精品人人澡人人爽| 国产精品国产亚洲精品看不卡| 日韩中文一区二区| 久久99视频精品| 国产视频一二三四区| 国产精品久久久久影院亚瑟| 亚洲最大成人在线观看| 成人3d动漫在线观看| 国产suv精品一区二区| 欧美一区二区视频| 日韩欧美成人精品| 四虎永久免费影院| 欧美综合二区| 品久久久久久久久久96高清| 成人爽a毛片免费啪啪| 日韩精品999| 特级做a爱片免费69| 久久亚洲一区二区三区四区| 欧美日韩激情视频在线观看| 亚洲精品蜜桃乱晃| 国产精品福利观看| 欧美成人xxx| 日韩三级电影网址| 国产黄色片视频| 久久麻豆一区二区| 男人添女人下面免费视频| 色喇叭免费久久综合网| 91久热免费在线视频| 伊人在我在线看导航| 精品国产乱码久久久久久久久| 日本一区二区网站| 久久精品人人做人人综合| 成人性生生活性生交12| 国产精品88久久久久久| 91av免费看| 玖玖在线播放| 这里只有精品在线观看| 99热这里只有精品3| 午夜欧美一区二区三区在线播放| 黄色av网址在线观看| 久久亚洲精品伦理| 一区二区三区国| 999久久久精品一区二区| 清纯唯美亚洲激情| 精品自拍一区| 精品一区二区亚洲| 在线免费一级片| 亚洲福利视频一区二区| 五月天综合视频| 国产一区二区导航在线播放| 欧美大片在线播放| 日韩综合在线| 国产精品视频免费观看| 91天天综合| 久久久久久久国产| 成年在线电影| 亚洲高清久久久久久| 国产精品传媒在线观看| 亚洲综合无码一区二区| 亚洲码无人客一区二区三区| 国内精品伊人久久久久av影院| 日本a视频在线观看| 青青草国产免费一区二区下载| 高清国产一区| 欧美爱爱视频| 国产91精品不卡视频| 九色porny在线| 亚洲欧美日韩精品久久| www日本高清| 欧美日韩国产高清一区二区| 日韩欧美视频在线免费观看| 国产精品电影一区二区| av直播在线观看| 国产成人在线色| 色婷婷综合网站| 亚洲综合不卡| avav在线播放| 亚洲国产不卡| 性欧美.com| 一区二区三区日本久久久| 91视频免费进入| 欧美爱爱视频| 国产精品视频公开费视频| 亚洲精品国产精品国产| 久久久久国产精品免费| а天堂中文在线官网| 一本色道久久88亚洲综合88| 污污网站免费在线观看| 欧美mv日韩mv国产网站app| 一级黄色片在线观看| 日本韩国一区二区| 黄色片中文字幕| 黑人巨大精品欧美一区二区三区 | 7777奇米亚洲综合久久 | 91精品国产麻豆| 亚洲午夜在线播放| 91国产精品成人| www.com亚洲| 色婷婷av一区二区三区之一色屋| 亚洲黄色一区二区| 午夜精品福利久久久| 精品无码久久久久久久| 亚洲午夜精品网| 久久中文字幕无码| 亚洲福利视频一区| 国产精品黄色大片| 欧美日韩在线看| 日本特级黄色片| 日本道精品一区二区三区| 在线观看 亚洲| 91成人在线免费观看| 亚洲 日本 欧美 中文幕| 在线欧美小视频| 亚洲视频中文字幕在线观看| 欧美色图第一页| 国产精品国产三级国产普通话对白 | 欧美在线观看黄| 亚洲国产一区二区精品专区| www.xxx麻豆| 国产一区二区你懂的| 精品国产免费av| 日韩精品色哟哟| 亚洲va在线va天堂va偷拍| 国产精品一区二区三区四区| 日本少妇xxx| 99久久免费精品高清特色大片| 少妇户外露出[11p]| 久久久国际精品| 成人黄色a级片| 综合欧美亚洲日本| 国产一级特黄aaa大片| 日韩欧美一区视频| 中文文字幕一区二区三三| 7777精品伊人久久久大香线蕉完整版 | 亚洲国产又黄又爽女人高潮的| 手机福利小视频在线播放| 亚洲色图色老头| caopen在线视频| 69久久夜色精品国产7777| 欧美三区四区| 91手机视频在线观看| 中文一区二区三区四区| 欧美另类视频在线| 亚洲a一区二区三区| 日韩国产一级片| 奇米精品一区二区三区在线观看| 在线观看免费视频污| 99国产精品久久久| www.黄色com| 精品久久久久人成| 136福利视频导航| 亚洲精品美女久久| 麻豆91在线| 欧美在线不卡区| 精品一区二区三区视频在线播放 | 欧美黄色大片在线观看| 久久人人爽人人爽人人av| 日韩av午夜在线观看| 手机在线观看日韩av| 久久久精品免费网站| 欧美日韩综合一区二区| 欧美主播一区二区三区| 日本黄色大片视频| 久久激情五月丁香伊人| 亚洲午夜天堂| www.久久草| 四季av在线一区二区三区| 欧美 日韩 国产一区| 国产一区不卡在线| 卡一卡二卡三在线观看| 天天综合日日夜夜精品| 国产一区二区在线视频聊天| 日韩精品视频三区| 日本色护士高潮视频在线观看 | 国产三级精品三级在线观看国产| 五月天久久狠狠| 亚洲资源av| 国产精品成人99一区无码| 亚洲人成网站精品片在线观看| 国产成人无码专区| 亚洲精品美女在线观看播放| www在线观看播放免费视频日本| 国产精品久久久久久亚洲调教| 日本一区福利在线| 欧美午夜小视频| 国产99久久精品| 亚洲色图综合区| 欧美精品成人一区二区三区四区| 麻豆app在线观看| 日韩美女福利视频| 欧美电影在线观看完整版| 丁香色欲久久久久久综合网| 激情综合五月婷婷| 中文字幕精品亚洲| 欧美亚洲动漫另类| 北岛玲一区二区三区| 日本高清+成人网在线观看| 女仆av观看一区| 国产美女无遮挡网站| 99久久99久久久精品齐齐| 国产精品18p| 精品国产免费人成在线观看| 先锋影音在线资源站91| 91丨九色丨国产| 国产精品v亚洲精品v日韩精品 | 欧美亚洲激情在线| 婷婷五月色综合香五月| 欧美女人性生活视频| xf在线a精品一区二区视频网站| 久久国产精品免费看| 亚洲美女av在线| 日日夜夜天天综合| 手机看片福利永久国产日韩| 美女免费视频一区二区| 午夜国产福利视频| 欧美一区二区人人喊爽| 尤物视频在线看| 国产综合精品一区二区三区| 亚洲尤物精选| 蜜臀久久99精品久久久久久| 欧美亚洲综合一区| 日本福利在线| 99在线国产| 中文亚洲字幕| 久久久久亚洲AV成人无在| 欧美精品在线观看播放| 在线三级中文| 久久国产一区| 老司机一区二区| 成人免费毛片xxx| 欧美精品一区二区三区在线 | 国产高清一区二区三区四区| 在线精品视频一区二区| 黄网站免费在线播放| 高清国产在线一区| 三级影片在线观看欧美日韩一区二区| 天天操天天干天天操天天干| 欧美精品v日韩精品v韩国精品v| 牛牛精品在线视频| 日韩欧美三级电影| 国产一区二区三区黄视频 | 亚洲在线电影| 亚洲熟女少妇一区二区| 精品少妇一区二区三区日产乱码 | 欧美aaa级片| 日韩欧美123| 精品国产第一福利网站| 中文网丁香综合网| jlzzjlzz国产精品久久| 中国一区二区视频| 欧美激情亚洲综合一区| 国产在视频线精品视频www666| 91精品视频国产| 姬川优奈aav一区二区| 1pondo在线播放免费| 国产伦精品一区二区三区免费视频 | 精品国内自产拍在线观看视频| 久久久久久综合网| 欧美午夜激情视频| 伊人电影在线观看| 亚洲国产精品久久久久久女王| 国产.欧美.日韩| 在线免费观看高清视频| 国产91成人在在线播放| 欧美黄色一级视频| 国产探花视频在线| 亚洲精品福利资源站|