真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

常見Java應(yīng)用如何關(guān)閉

這篇文章主要介紹“常見Java應(yīng)用如何關(guān)閉”,在日常操作中,相信很多人在常見Java應(yīng)用如何關(guān)閉問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”常見Java應(yīng)用如何關(guān)閉”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),尼瑪企業(yè)網(wǎng)站建設(shè),尼瑪品牌網(wǎng)站建設(shè),網(wǎng)站定制,尼瑪網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,尼瑪網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

一、前言

在我們進(jìn)行系統(tǒng)升級(jí)的時(shí)候,往往需要關(guān)閉我們的應(yīng)用,然后重啟。在關(guān)閉應(yīng)用前,我們希望做一些前置操作,比如關(guān)閉數(shù)據(jù)庫、redis連接,清理zookeeper的臨時(shí)節(jié)點(diǎn),釋放分布式鎖,持久化緩存數(shù)據(jù)等等。

二、Linux的信號(hào)機(jī)制

在linux上,我們關(guān)閉進(jìn)程主要是使用 kill 的方式。

當(dāng)執(zhí)行該命令以后,linux會(huì)向進(jìn)程發(fā)送一個(gè)信號(hào),進(jìn)程收到以后之后,可以做一些清理工作。

kill 命令默認(rèn)的信號(hào)值為 15 ,即 SIGTERM 信號(hào)。

通過 kill -l 查看linux支持哪些信號(hào):

常見Java應(yīng)用如何關(guān)閉

linux提供了 signal() api,可以將信號(hào)處理函數(shù)注冊(cè)上去:

#include  #include  #include  #include  #include   static void gracefulClose(int sig)   {     printf("執(zhí)行清理工作\n");     printf("JVM 已關(guān)閉\n");     exit(0);    //正常關(guān)閉 }  int main(int argc,char *argv[])   {     if(signal(SIGTERM,gracefulClose) == SIG_ERR)         exit(-1);      printf("JVM 已啟動(dòng)\n");      while(true)     {         // 執(zhí)行工作         sleep(1);     } }

三、Java提供的Shutdown Hook

Java并不支持類似于linux的信號(hào)機(jī)制,但是提供了 Runtime.addShutdownHook(Thread hook) 的api。

在JVM關(guān)閉前,會(huì)并發(fā)執(zhí)行各個(gè)Hook線程。

public class ShutdownHook {      public static void main(String[] args) throws InterruptedException {         Runtime.getRuntime().addShutdownHook(new DbShutdownWork());         System.out.println("JVM 已啟動(dòng)");          while(true){             Thread.sleep(10L);         }     }      static class DbShutdownWork extends Thread{         public void run(){             System.out.println("關(guān)閉數(shù)據(jù)庫連接");         }     } }

四、Spring Boot提供的優(yōu)雅關(guān)閉功能

我們一般采用如下的方式,啟動(dòng)一個(gè)Spring boot應(yīng)用:

public static void main(String[] args) throws Exception {       SpringApplication.run(SampleController.class, args); }

SpringApplication.run()代碼如下,會(huì)調(diào)用到refreshContext(context)方法:

public ConfigurableApplicationContext run(String... args) {       StopWatch stopWatch = new StopWatch();     stopWatch.start();     ConfigurableApplicationContext context = null;     FailureAnalyzers analyzers = null;     configureHeadlessProperty();     SpringApplicationRunListeners listeners = getRunListeners(args);     listeners.started();     try {         ApplicationArguments applicationArguments = new DefaultApplicationArguments(                 args);         ConfigurableEnvironment environment = prepareEnvironment(listeners,                 applicationArguments);         Banner printedBanner = printBanner(environment);         context = createApplicationContext();         analyzers = new FailureAnalyzers(context);         prepareContext(context, environment, listeners, applicationArguments,                 printedBanner);         refreshContext(context);         afterRefresh(context, applicationArguments);         listeners.finished(context, null);         stopWatch.stop();         if (this.logStartupInfo) {             new StartupInfoLogger(this.mainApplicationClass)                     .logStarted(getApplicationLog(), stopWatch);         }         return context;     }     catch (Throwable ex) {         handleRunFailure(context, listeners, analyzers, ex);         throw new IllegalStateException(ex);     } }

refreshContext()方法比較簡單:

private void refreshContext(ConfigurableApplicationContext context) {       refresh(context);   //調(diào)用ApplicationContext.refresh()     if (this.registerShutdownHook) {        //registerShutdownHook默認(rèn)值為true         try {             context.registerShutdownHook();         }         catch (AccessControlException ex) {             // Not allowed in some environments.         }     } }

AbstractApplicationContext.registerShutdownHook()代碼:

public void registerShutdownHook() {       if (this.shutdownHook == null) {         this.shutdownHook = new Thread() {             @Override             public void run() {                 synchronized (startupShutdownMonitor) {                     doClose();                 }             }         };         Runtime.getRuntime().addShutdownHook(this.shutdownHook);     } }

很明顯,Spring  boot通過在啟動(dòng)時(shí),向JVM注冊(cè)一個(gè)ShutdownHook,從而實(shí)現(xiàn)JVM關(guān)閉前,正常關(guān)閉Spring容器。而Spring在銷毀時(shí),會(huì)依次調(diào)用bean的destroy動(dòng)作來銷毀。

五、Dubbo的優(yōu)雅關(guān)閉策略

Dubbo同樣是基于ShutdownHook實(shí)現(xiàn)的。

AbstractConfig的static代碼:

static {       Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {         public void run() {             if (logger.isInfoEnabled()) {                 logger.info("Run shutdown hook now.");             }             ProtocolConfig.destroyAll();         }     }, "DubboShutdownHook")); }

六、總結(jié)

只要我們的應(yīng)用運(yùn)行在linux平臺(tái)上,所有的優(yōu)雅關(guān)閉方案都是基于linux提供的信號(hào)機(jī)制提供的,JVM也是如此。

Java并沒有為我們提供與之一一對(duì)應(yīng)的api,而是給出了個(gè)ShutdownHook機(jī)制,也能達(dá)到類似的效果,缺點(diǎn)是我們無法得知JVM關(guān)閉的原因。

像dubbo、spring  boot等成熟的開源框架,都實(shí)現(xiàn)了自動(dòng)注冊(cè)ShutdownHook的功能,從而避免使用者忘記調(diào)用優(yōu)雅關(guān)閉api引發(fā)問題,降低框架的使用難度。

到此,關(guān)于“常見Java應(yīng)用如何關(guān)閉”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


文章題目:常見Java應(yīng)用如何關(guān)閉
路徑分享:http://weahome.cn/article/ihgehs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部