精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久精品青草| 亚洲欧美久久精品| 久久久99免费| 成人看片人aa| 懂色av.com| 亚洲影院天堂中文av色| 欧美日本乱大交xxxxx| 久久av综合网| 97人人在线| 成人美女视频在线看| 国产999在线观看| 青青草原国产视频| 亚洲警察之高压线| 欧美一区二区女人| 999精品网站| 美女精品视频| 国产精品乱码妇女bbbb| 国产一区再线| 国产一区二区三区三州| 一区二区国产精品| 美女国产一区二区| 在线观看欧美日本| 久草免费福利在线| 欧美性videos| 国产亚洲综合在线| 国产精华一区| 一区二区精品视频在线观看| 免费久久99精品国产自在现线| 久久五月情影视| 色无极影院亚洲| 高清日韩中文字幕| 4438x成人网最大色成网站| aⅴ在线免费观看| 国产丝袜在线播放| 1区2区3区欧美| 婷婷五月色综合| 男人的天堂在线视频| 99热这里都是精品| 国产精品免费视频一区二区| 99国产精品一区二区三区| 丝袜脚交一区二区| 欧美一级视频免费在线观看| 国产一级二级三级视频| 亚洲情侣在线| 日韩一区二区三区xxxx| www亚洲色图| 精品国产乱码久久久久久蜜坠欲下 | 在线视频一区观看| 成人高清在线| 国产精品素人一区二区| 视频在线一区二区三区| 经典三级在线| 国产日产欧美一区二区视频| 欧美精品久久| 国自产拍在线网站网址视频| 26uuu欧美| 欧美一区二区三区在线免费观看| 加勒比一区二区三区在线| 久久久久久久久久久99999| 欧美一区观看| 自拍视频在线网| 亚洲婷婷在线视频| 亚洲五码在线观看视频| 在线观看av免费| 亚洲成人你懂的| 青青草国产精品视频| 涩涩视频在线| 欧美在线free| 日本77777| 97se亚洲| 亚洲女人天堂色在线7777| 一级黄色性视频| 日韩精品永久网址| 另类色图亚洲色图| 国产污视频在线观看| 日韩一区二区久久| 国产精品国产三级国产aⅴ9色 | av小说在线播放| 精品久久久久久久久中文字幕| 黑森林福利视频导航| av成人免费看| 日韩精品一区在线观看| 天堂www中文在线资源| 亚洲区小说区图片区qvod| 亚洲图片欧美日产| 久久av红桃一区二区禁漫| 欧美视频导航| 欧美在线免费视频| 夜夜躁很很躁日日躁麻豆| 成人综合在线观看| 日本不卡二区| 久久黄色美女电影| 午夜视黄欧洲亚洲| 538在线视频观看| 51vv免费精品视频一区二区| 国产丝袜高跟一区| 男人av资源站| 久久国产精品亚洲77777| 成人激情在线播放| 亚洲三级黄色片| 18成人在线观看| 1024精品视频| 国产精品777777在线播放| 日韩电影大全免费观看2023年上| 国产3级在线观看| 亚洲综合欧美| 国产精成人品localhost| 在线国产91| 久久大胆人体| 亚洲资源在线观看| 久久精品免费网站| 国产精品sss在线观看av| 中文字幕欧美日韩va免费视频| 国产在线视频卡一卡二| 久久 天天综合| 欧美男人的天堂| 中文字幕伦理免费在线视频| 欧美视频你懂的| 无码精品一区二区三区在线播放| 五月天久久777| 日韩美女免费线视频| 亚洲第一天堂影院| 自拍偷拍国产精品| 99视频免费播放| 秋霞影视一区二区三区| 欧美激情小视频| 国产毛片毛片毛片毛片| 国产欧美视频在线观看| www.com毛片| 大奶在线精品| 欧美激情视频网| 性欧美一区二区三区| 中文字幕在线免费不卡| 天堂在线资源视频| 国产一区二区三区四区二区| 26uuu日韩精品一区二区| 亚洲精品久久久久久久久久久久久久 | 亚洲影视综合| 国产一区二区三区高清| 青青草原av在线| 欧美一级电影网站| 中文字幕av久久爽av| 精品午夜久久福利影院| 亚洲乱码一区二区三区| 97精品国产99久久久久久免费| 亚洲免费一级电影| 丁香社区五月天| 久久欧美中文字幕| 黄色影院一级片| 色婷婷精品视频| 5278欧美一区二区三区| 水莓100在线视频| 黑人巨大精品欧美一区二区| 日本黄色片在线播放| 亚洲免费网址| 亚洲成人一区二区三区| av成人免费看| 久久午夜a级毛片| 精品国产一级片| 亚洲综合成人在线视频| av免费观看不卡| 亚洲精品麻豆| 欧美高清视频一区二区三区在线观看 | 中文字幕在线观看一区| 成人三级做爰av| 精品动漫一区| 欧美高清视频一区二区三区在线观看| 性欧美videohd高精| 最好看的2019年中文视频| 国产又粗又猛视频| 亚洲一区二区三区中文字幕在线| 午夜福利三级理论电影| 亚洲一区二区伦理| 亚洲看片网站| 91蜜桃臀久久一区二区| 欧美亚州一区二区三区| 成人资源www网在线最新版| 欧美精品v国产精品v日韩精品| 草视频在线观看| 91免费视频大全| 中国黄色片免费看| 欧美另类女人| 秋霞毛片久久久久久久久| 国产精选久久| 欧美最顶级丰满的aⅴ艳星| yw在线观看| 日韩欧美成人午夜| 成人公开免费视频| 亚洲色图清纯唯美| 久久久久久久久免费看无码 | 91社区在线高清| 日韩欧美一区二区不卡| 一区二区三区在线观看av| 《视频一区视频二区| av在线播放网址| 捆绑调教美女网站视频一区| 亚洲 欧美 综合 另类 中字| 神马电影久久| 丁香五月网久久综合| 91精品韩国| 久久久天堂国产精品女人| 成年人视频网站在线| 精品第一国产综合精品aⅴ| 特级西西444www大胆免费看| 亚洲一二三四区不卡| 俄罗斯毛片基地| 99久久婷婷国产综合精品电影 | 成+人+亚洲+综合天堂| 国产日韩欧美久久| 一本久道久久综合狠狠爱| 中文字幕一区二区三区四区五区六区 | 免费在线观看成人av| 综合视频免费看| 国产免费av一区二区三区| 国产精品.com| 视频精品二区| 国产区亚洲区欧美区| 亚洲天堂免费电影| 国外成人在线视频| 亚洲综合图区| 视频直播国产精品| 成人在线免费电影| 亚洲欧美精品一区二区| 天堂网在线播放| 精品剧情v国产在线观看在线| 中文字幕制服诱惑| 欧美最新大片在线看| 99热在线观看免费精品| 亚洲一二三区视频在线观看| 麻豆明星ai换脸视频| 日本一区二区三区高清不卡| 成人片黄网站色大片免费毛片| 成人h动漫精品一区二区| 国产无套精品一区二区三区| 黑人精品欧美一区二区蜜桃 | 99er精品视频| 国产美女精品视频免费观看| 日本欧美韩国| 国产成人拍精品视频午夜网站| 欧洲一区精品| 欧美亚洲在线播放| 中文在线中文资源| 欧洲精品在线视频| 一个人www视频在线免费观看| 97视频在线观看播放| 成人免费图片免费观看| 久久久久久久久国产| av最新在线| 欧美在线免费视频| 国产韩日精品| 国产日本欧美一区二区三区| 91精品视频一区二区| 91视频九色网站| 视频精品二区| 国产一区二区在线观看免费播放| 巨人精品**| 久久综合中文色婷婷| 国产精选一区| 亚洲一区二区在线看| 亚洲影视一区| 美脚丝袜脚交一区二区| 99国产精品久久久久久久| 成人三级视频在线播放| 秋霞午夜av一区二区三区| 亚洲18在线看污www麻豆| 国产一区欧美二区| 国产精品久久久久久亚洲av| 99久久er热在这里只有精品15| v8888av| 中文在线一区二区| 乱h高h女3p含苞待放| 亚洲国产乱码最新视频| 久久久久99精品成人片我成大片| 欧美中文字幕一区二区三区亚洲| 91精品国产乱码久久久| 精品伦理精品一区| 欧美扣逼视频| 操日韩av在线电影| av今日在线| 国产精品高清在线| 亚洲一区二区三区四区电影| 国内一区在线| 久久亚洲国产| 无码粉嫩虎白一线天在线观看| 老色鬼久久亚洲一区二区| www.se五月| av一区二区三区四区| 奇米网一区二区| 亚洲电影第三页| 中国一级特黄视频| 欧美不卡激情三级在线观看| 韩国三级在线观看久| 欧美床上激情在线观看| 免费电影日韩网站| 91在线播放视频| av一区二区在线播放| 日本一本中文字幕| 麻豆91小视频| 亚洲午夜福利在线观看| 亚洲精品乱码久久久久| 婷婷激情五月综合| 欧美白人最猛性xxxxx69交| 久久这里精品| 欧美激情第三页| 欧美黄色成人| 欧美日韩精品免费观看| 欧美体内she精视频在线观看| 中文字幕永久视频| 久久这里只有精品视频网| 久久精品波多野结衣| 欧美日韩五月天| 日韩av地址| 性欧美暴力猛交69hd| 中文一区二区三区四区| 亚洲一区二区在线看| 老司机午夜精品视频在线观看| 中文字幕视频观看| 日韩一区欧美一区| 久久午夜鲁丝片| 国产视频欧美视频| 蜜桃视频在线观看播放| 官网99热精品| 欧美一区精品| 99精品999| 国产精品高潮呻吟| 国产精品传媒在线观看| 精品亚洲va在线va天堂资源站| 国产探花视频在线观看| 亚洲xxxx做受欧美| 在线中文字幕亚洲| 中文字幕第17页| 国产精品福利av| 中文字幕一区二区人妻| 亚洲性日韩精品一区二区| 亚洲女同av| 蜜桃91精品入口| 亚洲免费综合| 爱爱的免费视频| 欧美日韩一二三四五区| 色视频在线观看福利| 26uuu久久噜噜噜噜| 啄木系列成人av电影| 免费在线观看的av网站| 2024国产精品| 在线观看污污网站| 国产亚洲精品美女| 高清欧美日韩| 香蕉精品视频在线| 国产一区二区在线电影| www.毛片com| 欧美www视频| 乱插在线www| 久草一区二区| 久久国产精品久久久久久电车 | 国产精品999999| 欧美亚洲精品在线| 日韩va在线观看| 伊人夜夜躁av伊人久久| 性欧美一区二区三区| 韩日精品中文字幕| 亚洲另类春色校园小说| 午夜宅男在线视频| 亚洲精品日韩一| 秋霞av鲁丝片一区二区| 欧美一区二区三区…… | 99视频在线免费播放| 26uuu成人网一区二区三区| 国产高清www| 久操精品在线| 九色91popny| 亚洲欧美日韩国产一区二区三区 | 国产麻豆成人精品| 国产在线综合网| 国产亚洲欧美视频| 97精品资源在线观看| 18禁网站免费无遮挡无码中文| 久久精品人人做| 999久久久久久| 欧美在线视频免费| 91精品99| 在线观看福利片| 欧美一区二区三区小说| 热三久草你在线| 中文字幕精品—区二区日日骚| www.一区二区| 中文字幕在线观看第二页| 欧美黑人又粗大| 欧美综合一区| 国产伦精品一区二区免费| 精品视频色一区| 96av在线| 秋霞在线一区二区| 久久综合久久综合久久综合| 91午夜交换视频| 日本久久亚洲电影| 欧美粗暴jizz性欧美20| 国产精品久久免费观看| 精品国产sm最大网站免费看| av久久网站| 欧洲av无码放荡人妇网站|