我的编程空间,编程开发者的网络收藏夹
学习永远不晚

常见Java应用如何关闭

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

常见Java应用如何关闭

这篇文章主要介绍“常见Java应用如何关闭”,在日常操作中,相信很多人在常见Java应用如何关闭问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”常见Java应用如何关闭”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、前言

在我们进行系统升级的时候,往往需要关闭我们的应用,然后重启。在关闭应用前,我们希望做一些前置操作,比如关闭数据库、redis连接,清理zookeeper的临时节点,释放分布式锁,持久化缓存数据等等。

二、Linux的信号机制

在linux上,我们关闭进程主要是使用 kill 的方式。

当执行该命令以后,linux会向进程发送一个信号,进程收到以后之后,可以做一些清理工作。

kill 命令默认的信号值为 15 ,即 SIGTERM 信号。

通过 kill -l 查看linux支持哪些信号:

常见Java应用如何关闭

linux提供了 signal() api,可以将信号处理函数注册上去:

#include <signal.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <stdbool.h>  static void gracefulClose(int sig)   {     printf("执行清理工作\n");     printf("JVM 已关闭\n");     exit(0);    //正常关闭 }  int main(int argc,char *argv[])   {     if(signal(SIGTERM,gracefulClose) == SIG_ERR)         exit(-1);      printf("JVM 已启动\n");      while(true)     {         // 执行工作         sleep(1);     } }

三、Java提供的Shutdown Hook

Java并不支持类似于linux的信号机制,但是提供了 Runtime.addShutdownHook(Thread hook) 的api。

在JVM关闭前,会并发执行各个Hook线程。

public class ShutdownHook {      public static void main(String[] args) throws InterruptedException {         Runtime.getRuntime().addShutdownHook(new DbShutdownWork());         System.out.println("JVM 已启动");          while(true){             Thread.sleep(10L);         }     }      static class DbShutdownWork extends Thread{         public void run(){             System.out.println("关闭数据库连接");         }     } }

四、Spring Boot提供的优雅关闭功能

我们一般采用如下的方式,启动一个Spring boot应用:

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

SpringApplication.run()代码如下,会调用到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);   //调用ApplicationContext.refresh()     if (this.registerShutdownHook) {        //registerShutdownHook默认值为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通过在启动时,向JVM注册一个ShutdownHook,从而实现JVM关闭前,正常关闭Spring容器。而Spring在销毁时,会依次调用bean的destroy动作来销毁。

五、Dubbo的优雅关闭策略

Dubbo同样是基于ShutdownHook实现的。

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")); }

六、总结

只要我们的应用运行在linux平台上,所有的优雅关闭方案都是基于linux提供的信号机制提供的,JVM也是如此。

Java并没有为我们提供与之一一对应的api,而是给出了个ShutdownHook机制,也能达到类似的效果,缺点是我们无法得知JVM关闭的原因。

像dubbo、spring  boot等成熟的开源框架,都实现了自动注册ShutdownHook的功能,从而避免使用者忘记调用优雅关闭api引发问题,降低框架的使用难度。

到此,关于“常见Java应用如何关闭”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

常见Java应用如何关闭

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

win101909应用自启动如何关闭

今天小编给大家分享一下win101909应用自启动如何关闭的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。方法一: 1.卸载设
2023-07-01

java常见log日志如何使用

今天小编给大家分享一下java常见log日志如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言log日志可以debu
2023-07-02

如何在java中使用关闭钩子

如何在java中使用关闭钩子?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分
2023-06-14

如何关闭电脑端口 关闭不常用端口的2种方法

通常电脑每一项系统服务都有一个对应端口,例如phpWWW服务是80端口,一般比较关注电脑端口的朋友都是针对服务器的,因为服务器的安全对于每个站长或管理员都十分重要。通过关闭不常用的端口,可以有效的将黑客拒之千里之外。关闭了一个端口等于将一扇
2023-05-31

如何关闭Windows 8.1应用自动更新

Windows 8.1系统支持应用自动更新,不过有些朋友也许并不需要每个应用都被Windows 8.1自作主张的自动更新。其实我们可以轻松将Windows 8.1系统中的自动应用更新状态设置为关闭,回到应用手动更新状态,这样可以更加自主灵活
2022-06-04

如何强制关闭Ubuntu中无响应应用程序

这篇文章主要介绍如何强制关闭Ubuntu中无响应应用程序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!方法1:对无响应的基于UI的应用程序使用X按钮如果您的一个基于UI的应用程序的响应时间比预期的长得多,或者它处于挂
2023-06-16

Modern UI上没有关闭按钮如何快速关闭Win8 Modern UI应用

Win8系统里的Modern UI是微软开发的Windows 8操作系统中所带的一种全新风格的界面设计,它的前身即是Metro UI。很多用户想关闭Win8的Modern UI应用,但却不知编程客栈道在哪儿关,因为Modern UI上没有关
2023-06-05

python如何关闭异常自动关联上下文

这篇文章将为大家详细讲解有关python如何关闭异常自动关联上下文,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如何关闭异常自动关联上下文当你在处理异常时,由于处理不当或者其他问题,再次抛出另一个异常时,
2023-06-27

Win8Metro应用自动更新功能如何关闭

Win8系统为Metro应用提供了自动更新的功能,初衷是为了方便用户,但新版本并非就是人人喜欢的。如果我们不想让Metro应用自动更新,该如何关闭这一功能呢?操作方法第一步、点击开始屏幕应用商店,进入应用商店界面后,使用鼠标手势,调出Cha
2022-06-04

电脑如何关闭无响应进程

这篇文章主要介绍“电脑如何关闭无响应进程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“电脑如何关闭无响应进程”文章能帮助大家解决问题。电脑关闭无响应进程方法:方法一:命令关闭打开命令提示符并在提示符
2023-06-27

阿里云服务器如何关闭应用程序

在使用阿里云服务器的过程中,我们可能会遇到需要关闭应用程序的情况。关闭应用程序不仅可以节省资源,还可以避免不必要的错误。本文将详细说明如何在阿里云服务器上关闭应用程序。一、关闭应用程序的步骤登录阿里云控制台首先,你需要登录阿里云控制台。如果你还没有账号,你可以通过手机号或邮箱进行注册。登录后,你会看到控制台的主界
阿里云服务器如何关闭应用程序
2023-11-11

win10中1909系统应用自启动如何关闭

这篇文章给大家分享的是有关win10中1909系统应用自启动如何关闭的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。方法一:1.卸载设备中的第三方杀毒、管家、优化软件2.同时按【Windows 徽标键+R】,输入
2023-06-10

Win8如何关闭Metro应用Metro界面程序如何退出

Win8的开始屏幕,也叫Metro界面,被很多用户吐槽,因为这一新增功能大家实在是很不习惯,甚至是无从下手。最简单的问题比如:Metro界面程序如何退出?方法一:使用左侧任务栏结束任务. 将鼠标慢慢移到左下角或是左上角,待出现某一图标后,鼠
2022-06-04

win8系统如何关闭不常用文件索引功能

这篇文章将为大家详细讲解有关win8系统如何关闭不常用文件索引功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、首先按快捷键“win+x”打开菜单栏,然后选择“控制面板”。如图示:二、在打开的控制面板
2023-06-28

编程热搜

目录