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

SpringBoot 優雅停機的正確姿勢

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

?一、介紹

什么叫優雅停機?

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

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

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

那么如何在不影響正在執行的業務的情況下,將應用程序安全的進行關閉呢?

二、方案實踐

SpringBoot 官方文檔上,已經告訴開發者只需要實現特定接口即可監聽到項目啟動成功與關閉時的事件,相關接口如下:

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

基于此流程,我們可以創建一個服務監聽類,用于監聽到項目啟動成功與關閉時的回調服務,示例代碼如下:

@Component
public class AppListener implements CommandLineRunner, DisposableBean {

@Override
public void run(String... args) throws Exception {
System.out.println("應用啟動成功,預加載相關數據");
}

@Override
public void destroy() throws Exception {
System.out.println("應用正在關閉,清理相關數據");
}

}

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

2.1、方法一:通過Actuator的Endpoint機制關閉服務

使用此方法,需要先添加spring-boot-starter-actuator監控服務依賴包,

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

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

management.endpoint.shutdown.enabled=true

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

management.endpoints.web.exposure.include=shutdown

最后將SpringBoot?服務啟動之后,使用POST請求類型,調用以下接口,即可實現關閉服務!

http://127.0.0.1:8080/actuator/shutdown

圖片

2.2、方法二:使用ApplicationContext的close方法關閉服務

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

只需要在應用啟用的時候,獲取ApplicationContext?對象,然后在相關的位置調用close方法,就可以關閉服務。

示例代碼如下:

@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();
}
//啟動10秒以后,自動關閉
context.close();
}
}

當然我們也可以自己寫一個Controller?,獲取對應的ApplicationContext?對象,通過api?操作調用close方法關停服務,示例代碼如下:

@RestController
public class ShutdownController implements ApplicationContextAware {

private ApplicationContext context;

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

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

2.3、方法三:監聽服務pid,通過kill方式關閉服務

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

在springboot?啟動的時候將應用進程 ID 寫入一個app.pid文件,生成的路徑可以指定,然后通過腳本命令方式來關閉服務。

啟動示例代碼如下:

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

通過如下命令方式,可以安全的關閉服務。

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

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

如果使用?kill -9 <pid>的方式關閉服務,服務的監聽器不會收到任何消息,類似于直接強殺應用進程,此方法不可取!

2.4、方法四:使用SpringApplication的exit方法關閉服務

通過調用一個SpringApplication.exit()?方法也可以安全的退出程序,同時會返回一個退出碼,這個退出碼可以傳遞給所有的context?,最后通過調用System.exit()?可以將這個錯誤碼也傳給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秒后,關閉服務
exitApplication(context);
}

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

}

三、其他監聽介紹

3.1、ApplicationListener

如果有些服務,比如定時任務,我們想在SpringBoot?關閉數據源連接池之前,將其關閉,可以通過實現ApplicationListener?接口,監聽bean?對象的變化情況,在bean對象銷毀之前,執行相關的關閉任務。

示例代碼如下:

@Component
public class JobTaskListener implements ApplicationListener {

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

3.2、PreDestroy

上文中,我們提到了實現DisposableBean?接口,可以監聽應用關閉前的回調處理,其實在自定義的方法上加@PreDestroy注解,也可以實現相同的效果。

示例代碼如下:

@Component
public class AppDestroyConfig {

@PreDestroy
public void PreDestroy(){
System.out.println("應用程序正在關閉。。。");
}
}

四、小結

本位主要圍繞如何安全的關閉SpringBoot服務,進行了一些方案操作的介紹,如果有疏漏的地方,歡迎網友批評指出!

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2025-03-11 00:55:00

Spring停機安全

2024-10-18 08:53:49

SpringMybatis微服務

2024-03-18 14:06:00

停機Spring服務器

2025-03-17 00:00:00

2021-05-08 08:33:00

Rocketmq日志數據源

2024-07-22 19:31:34

2025-07-29 08:25:57

2018-01-11 15:31:39

命令Linux關機

2017-02-23 15:37:44

OptionObject容器

2016-05-09 10:41:03

算法分析開發

2017-07-10 13:09:45

前端Flexbox

2017-03-16 11:39:33

Openstack源碼姿勢

2011-01-20 10:09:25

2021-01-08 08:10:34

MySQL表空間回收

2017-10-12 11:30:34

Spark代碼PR

2019-12-27 15:58:57

大數據IT互聯網

2024-09-25 08:22:06

2021-09-15 16:20:02

Spring BootFilterJava

2016-12-12 08:48:24

2024-08-02 09:15:22

Spring捕捉格式
點贊
收藏

51CTO技術棧公眾號

日韩av免费观影| 美女被到爽高潮视频| 好吊日视频在线观看| 国产精品1区2区| 国产91av在线| 很污很黄的网站| 成人av动漫| 欧美午夜精品一区二区三区| 97av中文字幕| 蜜桃精品成人影片| 国产精品久久乐| 亚洲一区二区三区四区在线观看| 美女三级99| 国产乱码精品一区二三区蜜臂| 亚洲国产精品第一区二区| 亚洲视频精品在线| 91精品人妻一区二区三区四区| 免费电影日韩网站| 一区二区三区欧美视频| 国产狼人综合免费视频| 久久久国产精品黄毛片| 精品国产午夜| 亚洲国产欧美一区二区三区同亚洲| 在线观看高清免费视频| 中国字幕a在线看韩国电影| 亚洲图片激情小说| 色阁综合av| 国产精品av在线| 日本成人在线免费视频| 青春草在线免费视频| 国产精品毛片大码女人| 玛丽玛丽电影原版免费观看1977| www.热久久| 久久99精品国产| 伊人伊人伊人久久| 午夜男人的天堂| 欧美另类中文字幕| 亚洲永久精品大片| 亚欧洲精品在线视频免费观看| 无码精品人妻一区二区| 国产91对白在线观看九色| 91精品国产综合久久男男| 欧美特级黄色片| 免费在线观看成人av| 高清欧美一区二区三区| 国产高清成人久久| 精品国产亚洲一区二区三区| 欧美午夜精品一区二区蜜桃| 国产极品美女高潮无套久久久| heyzo高清在线| 亚洲午夜在线视频| 久青草视频在线播放| 国产一二区在线观看| 亚洲欧洲日韩一区二区三区| 亚洲一区二区高清视频| 一区二区的视频| 日本少妇一区二区| 国产精品成人观看视频国产奇米| 亚洲欧美自拍视频| 久久九九国产| 国产精品久久久久久久app| 午夜精品一区二| 日本一不卡视频| 国产精品美女在线观看| 神马久久精品综合| 香蕉精品视频在线观看| 久久亚洲精品一区二区| 伊人在线视频观看| 欧美精品97| 久久久久久久久久久久久久久久久久av| 我家有个日本女人| 亚洲无线一线二线三线区别av| 国内视频精品| 91精品国产综合久久精品| 91亚洲一区二区| segui88久久综合| 亚洲国产精品尤物yw在线观看| 日韩小视频网站| а√在线天堂官网| 色综合久久久久久久久久久| 成人免费xxxxx在线视频| 国产成人精品一区二区三区免费| 亚洲国产另类av| www一区二区www免费| 久久久人成影片一区二区三区在哪下载| 日本久久电影网| 久久撸在线视频| 欧产日产国产精品视频| 一本大道av一区二区在线播放| 波多结衣在线观看| 疯狂欧洲av久久成人av电影| 日韩精品最新网址| 美女久久久久久久久久| 婷婷亚洲综合| 5278欧美一区二区三区| ,亚洲人成毛片在线播放| 丁香啪啪综合成人亚洲小说 | av成人毛片| 国产精品69av| 国产小视频免费观看| 国产亚洲午夜高清国产拍精品 | 欧美一区二区三区视频在线 | 亚洲第一页在线观看| 久久夜色精品国产欧美乱极品| 亚洲精品在线观看免费| av电影免费在线看| 制服丝袜在线91| 色无极影院亚洲| 一级毛片免费高清中文字幕久久网| 亚洲91精品在线观看| 亚洲影视一区二区| 久久免费偷拍视频| 欧美国产日韩激情| 国产第一亚洲| 亚洲第五色综合网| 在线观看亚洲网站| 久久亚洲色图| 国产一级特黄a大片99| 色欧美激情视频在线| 第一福利永久视频精品| 久久精品一卡二卡| 成人免费电影网址| 日韩免费观看视频| 四虎在线视频免费观看| 亚洲精品亚洲人成人网| 91极品尤物在线播放国产| 日本一道高清一区二区三区| 欧美人成在线视频| 国产人妖一区二区| 国内精品久久久久影院一蜜桃| 国产精品亚洲综合| aa在线视频| 在线电影国产精品| 黄大色黄女片18免费| 老鸭窝毛片一区二区三区| 国产在线播放一区二区| 国产乱码在线| 精品国产乱码久久久久久闺蜜| 婷婷久久综合网| 欧美黄色aaaa| 91精品久久久久久久久久久久久久| 日本美女一级视频| 中文字幕一区二区日韩精品绯色| 国产真人做爰毛片视频直播| 精品中文在线| 免费99精品国产自在在线| 91久久久久国产一区二区| 亚洲国产精品ⅴa在线观看| 免费在线观看的毛片| 国产精品免费不| 国产99久久精品一区二区永久免费 | wwwav在线| 欧美一区二区三区日韩视频| 日韩在线一卡二卡| 国产综合久久久久久久久久久久| 中文字幕乱码一区二区三区| 日韩色性视频| 久久久国产一区二区三区| 免费中文字幕视频| 国产精品一区二区久久精品爱涩| 中国一级黄色录像| 日本一区二区乱| 欧美激情视频一区二区| 人妻丰满熟妇av无码区hd| 午夜欧美大尺度福利影院在线看| 国产免费视频传媒| 精品欧美激情在线观看| 国产欧美一区二区三区视频| 看女生喷水的网站在线观看| 欧美一区二区高清| 亚洲激情视频一区| 久久久不卡网国产精品一区| 欧美婷婷精品激情| 中文字幕免费一区二区| 国产伦精品一区二区三毛| 五月天av在线| 色噜噜狠狠狠综合曰曰曰| 国产强被迫伦姧在线观看无码| 亚洲国产三级在线| 亚洲国产天堂av| 国产在线精品不卡| 欧美久久久久久久久久久久久| 亚洲精品亚洲人成在线| 91精品国产综合久久久久久蜜臀| 色婷婷在线播放| 欧美色综合久久| 日本精品在线免费观看| 不卡av电影在线播放| 激情综合网婷婷| 9999国产精品| 国新精品乱码一区二区三区18| 依依综合在线| 欧美精品亚州精品| 四虎精品在线| 欧美一卡二卡三卡四卡| 国产综合精品视频| 亚洲欧美激情在线| 丝袜美腿中文字幕| 国产精品白丝jk黑袜喷水| 91黄色小网站| 欧美日一区二区在线观看| 欧美精品国产精品久久久| 国产精品3区| 欧美怡红院视频一区二区三区| 黄色av电影在线播放| 亚洲奶大毛多的老太婆| 精品区在线观看| 欧美午夜不卡在线观看免费| 国产精品第二十页| 中文字幕亚洲成人| 成年人免费观看视频网站| 国产精品性做久久久久久| 国产又大又黄又猛| 国产九九精品| 一卡二卡三卡视频| 日韩精品四区| 国产精品96久久久久久| 欧美videossex另类| 中文字幕亚洲欧美日韩高清 | 亚洲三级av在线| 老熟妇高潮一区二区高清视频| 欧美日韩免费视频| 人人妻人人爽人人澡人人精品| 亚洲电影一区二区| 久草中文在线视频| 中文字幕亚洲在| 中文字幕有码在线播放| 91视频在线观看免费| 国产精品日日摸夜夜爽| 国产一区二区影院| 成 人 黄 色 小说网站 s色| 天堂av在线一区| 狠狠爱免费视频| 一本久道久久综合婷婷鲸鱼| 极品粉嫩国产18尤物| 欧美精品黄色| 欧美日韩午夜爽爽| 亚洲天天综合| 少妇熟女一区二区| 99久久综合狠狠综合久久aⅴ| 视频一区二区在线| 成人免费电影网址| 亚洲人体一区| 国产精品久久久久蜜臀| 亚洲一区三区电影在线观看| 欧美一二区在线观看| 色综合影院在线观看| 国产成人调教视频在线观看| 日本a级片久久久| 国产99亚洲| 日本成人三级电影网站| 欧美一二区在线观看| 正在播放久久| 女人色偷偷aa久久天堂| 青青草综合在线| 好看不卡的中文字幕| www.日本少妇| 国产精品主播| 亚洲黄色a v| 精品一区二区三区免费观看| 日韩精品视频网址| 国产很黄免费观看久久| 亚洲欧美高清在线| 91美女视频网站| 亚洲国产日韩一区无码精品久久久| 国产欧美一二三区| 91香蕉一区二区三区在线观看| 亚洲精品美腿丝袜| 日本熟妇一区二区| 欧美性xxxxx极品| 中文字幕av网站| 欧美一区二区视频在线观看| www.色视频| 亚洲男人天天操| 女女色综合影院| 欧美疯狂性受xxxxx另类| 涩涩av在线| 国产精品专区h在线观看| 欧美欧美在线| 欧美裸体网站| 希岛爱理av一区二区三区| 日本免费a视频| 可以看av的网站久久看| 蜜桃福利午夜精品一区| 成人黄页毛片网站| 人与嘼交av免费| 一片黄亚洲嫩模| 波多野结衣电影在线播放| 日韩亚洲欧美中文三级| 日本私人网站在线观看| 精品国产一区二区三区久久狼黑人 | 天天综合网在线观看| 中文字幕视频在线免费欧美日韩综合在线看 | 亚洲婷婷久久综合| 日韩一级免费一区| 国产日韩精品在线看| 色综合久综合久久综合久鬼88| 国产精品一区二区av影院萌芽| 91色琪琪电影亚洲精品久久| 天天躁日日躁成人字幕aⅴ| 中日韩在线视频| 国产精品久久久亚洲一区| 热久久久久久久久| 91蝌蚪porny成人天涯| 97成人资源站| 在线免费不卡视频| 色综合久久久久久| 久久精品人人做人人爽| 都市激情亚洲一区| caoporen国产精品| 国产伊人久久| 久草一区二区| 国产精品第十页| 一女二男3p波多野结衣| 久久亚洲春色中文字幕久久久| 青青草手机视频在线观看| 欧美日韩一本到| 你懂的在线播放| 久久免费福利视频| 日韩区欧美区| 永久免费精品视频网站| 日本成人超碰在线观看| 欧美 变态 另类 人妖| 亚洲午夜在线观看视频在线| 国产视频第二页| 久久精品福利视频| 国产精品美女午夜爽爽| 日韩免费av电影| 欧美综合国产| 日韩成人av一区二区| 亚洲专区一二三| www.色日本| 欧美激情a∨在线视频播放| 96sao精品免费视频观看| 亚洲国产欧美不卡在线观看| 老鸭窝毛片一区二区三区| 成人免费网站黄| 色婷婷精品久久二区二区蜜臀av| 午夜视频www| 欧美一区二区三区…… | 一本久道久久综合狠狠爱亚洲精品| 亚洲一区黄色| 亚洲欧美日本一区| 欧美日韩亚洲国产一区| 色婷婷综合视频| 国内精品400部情侣激情| 国产成人aa在线观看网站站| 国产欧美精品aaaaaa片| 高清不卡在线观看av| 欧美精品xxxxx| 亚洲成人黄色在线| 特黄毛片在线观看| 欧美在线激情| 蜜芽一区二区三区| 污污视频网站在线免费观看| 欧美日韩国产高清一区二区三区 | 国产麻豆xxxvideo实拍| 亚洲777理论| 欧美成人片在线| 国产精品免费一区| 日本a级不卡| 18深夜在线观看免费视频| 一区二区免费看| 五月天婷婷在线播放| 国产91九色视频| 国产精品传媒精东影业在线| 伦伦影院午夜理论片| 亚洲大片在线观看| 日本国产在线| 国产精品女主播视频| 欧美精品不卡| 亚洲综合色一区| 69堂亚洲精品首页| 超碰97免费在线| 日韩午夜视频在线观看| 精品系列免费在线观看| 久久久久久久久精| 亚洲人成在线播放| 久久在线观看| 99爱视频在线| 亚洲视频免费在线观看| 人妻一区二区三区| 国产精品久久77777| 欧美福利影院| 美女被到爽高潮视频| 日韩一区二区三区免费看| 丝袜老师在线| 中国 免费 av| 久久众筹精品私拍模特| 国产精品久久免费| 7777免费精品视频| 亚洲91久久| 人妻无码一区二区三区| 欧美精品日韩一本| 一区二区精品伦理...| 永久免费在线看片视频| 久久九九99视频| 亚洲va欧美va| 国产在线观看一区二区三区| 国产欧美综合一区二区三区|