(三)SpringBoot停止服务的方法
SpringBoot停止服务的方法
在使用Springboot的时候,都要涉及到服务的停止和启动,当停止服务的时候,很多时候都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭。而且一些没有执行完的程序就会直接退出。
很多时候都需要安全的将服务停止,也就是把没有处理完的工作继续处理完成。比如停止一些依赖的服务,输出一些日志,发一些信号给其他的应用系统,这个在保证系统的高可用是非常有必要的。
第一种:actuator
Springboot提供的actuator的功能,它可以执行shutdown, health, info等,默认情况下,actuator的shutdown是disable的,我们需要打开它。首先引入acturator的maven依赖。
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然后将shutdown节点打开,也将/actuator/shutdown暴露web访问也设置上,除了shutdown之外还有health, info的web访问都打开的话将management.endpoints.web.exposure.include=*就可以。
将如下配置设置到application.properties里边,设置一下服务的端口号为3333。
server.port=3333
management.endpoint.shutdown.enabled==shutdown
接下来,创建一个springboot工程,然后设置一个bean对象,配置上PreDestroy方法。
这样在停止的时候会打印语句。bean的整个生命周期分为创建、初始化、销毁,当最后关闭的时候会执行销毁操作。在销毁的方法中执行一条输出日志。
public class TerminateBean {
    @PreDestroy
    public void preDestroy() {
        System.out.println("TerminalBean is destroyed");
    }
}
做一个configuration,然后提供一个获取bean的方法,这样该bean对象会被初始化。
@Configurationpublic
class ShutDownConfig {
    @Bean
    public TerminateBean getTerminateBean(){
        return new TerminateBean();
    }
}
在启动类里边输出一个启动日志,当工程启动的时候,会看到启动的输出,接下来执行停止命令。
curl -X POST http://localhost:3333/actuator/shutdown
日志可以输出启动时的日志打印和停止时的日志打印,同时程序已经停止。
第二种:context
获取程序启动时候的context,然后关闭主程序启动时的context。这样程序在关闭的时候也会调用PreDestroy注解。如下方法在程序启动十秒后进行关闭。
/* method 2: use ctx.close to shutdown all application context */
ConfigurableApplicationContext ctx = SpringApplication.run(ShutdowndemoApplication.class, args);
try {
   TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
   e.printStackTrace();
}
ctx.close();
第三种:进程号
在springboot启动的时候将进程号写入一个app.pid文件,生成的路径是可以指定的,可以通过命令 cat /Users/huangqingshi/app.id | xargs kill 命令直接停止服务,这个时候bean对象的PreDestroy方法也会调用的。
这种方法大家使用的比较普遍。
写一个start.sh用于启动springboot程序,然后写一个停止程序将服务停止。
/* method 3 : generate a pid in a specified path, while usecommand to shutdown pid : 'cat /Users/huangqingshi/app.pid | xargs kill' */
SpringApplication application = new SpringApplication(ShutdowndemoApplication.class);
application.addListeners(new ApplicationPidFileWriter("/Users/huangqingshi/app.pid"));
application.run();
第四种:SpringApplication.exit()
通过调用一个SpringApplication.exit()方法也可以退出程序,同时将生成一个退出码,这个退出码可以传递给所有的context。
这个就是一个JVM的钩子,通过调用这个方法的话会把所有PreDestroy的方法执行并停止,并且传递给具体的退出码给所有Context。通过调用System.exit(exitCode)可以将这个错误码也传给JVM。
程序执行完后最后会输出:Process finished with exit code 0,给JVM一个SIGNAL。
/* method 4: exit this application using static method */
ConfigurableApplicationContext ctx = SpringApplication.run(ShutdowndemoApplication.class, args);
exitApplication(ctx);
public static void exitApplication(ConfigurableApplicationContext context) {
   int exitCode = SpringApplication.exit(context,
    (ExitCodeGenerator) () -> 0);
   System.exit(exitCode);
}
第五种:自定义Controller
自己写一个Controller,然后将自己写好的Controller获取到程序的context,然后调用自己配置的Controller方法退出程序。通过调用自己写的/shutDownContext方法关闭程序:
curl -X POST http://localhost:3333/shutDownContext。
@RestControllerpublic class ShutDownController implements ApplicationContextAware {    private ApplicationContext context;
    @PostMapping("/shutDownContext")    public String shutDownContext() {
        ConfigurableApplicationContext ctx = (ConfigurableApplicationContext) context;
        ctx.close();
        return "context is shutdown";
    }
    @GetMapping("/")
    public String getIndex() {
        return "OK";
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }
}
												
											(三)SpringBoot停止服务的方法的更多相关文章
- 解决关闭ssh后网页停止服务的方法,利用nohup
		
上一篇文章提到宝塔面板无法运行,只能用ssh运行app.py. 关闭ssh时,app.py会被杀死.因为app.py的父进程就是ssh,关掉ssh会造成进程被杀死. 解决方法参考 https://w ...
 - 基于C#实现Windows服务状态启动和停止服务的方法
		
网址:http://www.jb51.net/article/89230.htm
 - Nginx停止服务和各种命令
		
1.停止Nginx服务的四种方法 从容停止服务这种方法较stop相比就比较温和一些了,需要进程完成当前工作后再停止. nginx -s quit 立即停止服务这种方法比较强硬,无论进程是否在工作,都直 ...
 - Zabbix 4.4 离线安装 使用mariadb的踩坑,无法停止服务
		
先分享一个网站,之前就没注意过有这个网站,不知道是啥时候开放的.里面分享了N多zabbix的模板. https://share.zabbix.com/ 报错如下 Unsupported charset ...
 - Springboot 优雅停止服务的几种方法
		
在使用Springboot的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭.而且一些没有执行完的程序就会直接退出 ...
 - Android service ( 一 ) 三种开启服务方法
		
一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟 Activ ...
 - Windows 共享无线上网 无法启动ICS服务解决方法(WIN7 ICS服务启动后停止)
		
Windows 共享无线上网 无法启动ICS服务解决方法(WIN7 ICS服务启动后停止) ICS 即Internet Connection Sharing,internet连接共享,可以使局域网上其 ...
 - SpringBoot微服务架构下的MVC模型总结
		
SpringBoot微服务架构下的MVC模型产生的原因: 微服务概念改变着软件开发领域,传统的开源框架结构开发,由于其繁琐的配置流程 , 复杂的设置行为,为项目的开发增加了繁重的工作量,微服务致力于解 ...
 - Linux下不停止服务,清空nohup.out文件
		
转载:http://www.sucheasy.com/OracleFusionMiddleware/640.html 1.nohup.out的由来及作用 用途:LINUX命令用法,不挂断地运行命令. ...
 
随机推荐
- FPT: Feature Pyramid Transfomer
			
导言: 本文介绍了一个在空间和尺度上全活跃特征交互(fully active feature interaction across both space and scales)的特征金字塔transf ...
 - 【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法
			
大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub : https://github.com/rongweihe/Mor ...
 - python-scrapy爬取某招聘网站信息(一)
			
首先准备python3+scrapy+mysql+pycharm... 这次我们选择爬取智联招聘网站的企业招聘信息,首先我们有针对的查看网站的html源码,发现其使用的是js异步加载的方式,直接从服务 ...
 - java容器-Collection
			
1.介绍 collection<E>是java中容器的最主要的接口,该接口继承于Iterable<E>,使得java中所有实现Collection<E>的容器 ...
 - 风炫安全WEB安全学习第二十四节课  利用XSS钓鱼攻击
			
风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击 XSS钓鱼攻击 HTTP Basic Authentication认证 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候 ...
 - LeetCode448-数组中消失的数字
			
题目 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能 ...
 - 剑指offer之重建二叉树
			
1.问题描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列pre {1,2,4,7,3,5,6, ...
 - python中列表的insert和append的效率对比
			
python中insert和append方法都可以向列表中插入数据只不过append默认插入列表的末尾,insert可以指定位置插入元素. 我们来测试一下他俩插入数据的效率: 测试同时对一个列表进行插 ...
 - MySQL select 子查询的使用
			
### 子查询 >where 这个值是计算出来的 >本质:`在 where 语句中嵌套一个子查询语句` ```sql /*============== 子查询 ============== ...
 - kubernets之job资源
			
一 介绍job资源 1.1 前面介绍的RC,RS,DS等等,管控的pod都是需要长期持久的运行的应用,但是尝试考虑另外一种场景,在微服务的场景下,有些pod的作用就是需要 执行完一些命令之后正常 ...