在SpringBoot项目中我们要优雅的停止服务器就是在启动停服的时候,去处理一下数据落库、保存状态等等相关的逻辑。
而SpringBoot的优雅关服有很多的方法,我们用一种比较简单,而且关服命令也比较简单的方式来处理优雅关服。
指定java项目生成的PID
@SpringBootApplication
public class FightApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(FightApplication.class);
application.addListeners(new ApplicationPidFileWriter("./app.pid"));
application.run(args);
}
}
处理kill杀进程的时候,让其处理结束事情
@Component
public class ShutdownServer {
@PreDestroy
public void shutdown() throws InterruptedException {
Thread.sleep(5000);
System.out.println("关闭服务器");
Thread.sleep(5000);
System.out.println("关闭服务器成功");
}
}
部署到linux中,并编写shell脚本
cat ../app.id | xargs kill
如果是kill的方式结束进程它是能够正确的结束的,会有一个返回码如下
而如果使用kill -9 的方式强制去结束进程,是没有返回码,而是显示已杀死进程
总结
由于是使用kill的方式,它会想java程序发送一个信号,当项目接收到这个信号的时候会去调用醒目中的@PreDestory注解备注的方法。从而关闭服务器。