SpringBoot之优雅关闭系统

在使用SpringBoot的时候,通常情况下,我都是使用ps -ef | grep java 找到对于的服务器id,然后通过kill -9 进程号进行删除的,这样会导致正在进行的进程也会被关闭,而没有将目前的工作进行保存,最近看到一篇文章,也就自己进行尝试,参考链接放在了最后面

  1. 通过SpringBoot提供的actuator
    actuator提供审计,健康检查,HTTP跟踪等功能,能够帮助我们监控和管理SpringBoot,在这里他提供了执行shutdown的功能
<!--  添加依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>


#在application.yml 中进行配置,shutdown默认是关闭的,这里需要将其设置为true,同时将接口暴露出来到web上
management:
  endpoint:
    shutdown:
      enabled: true
  endpoints:
    web:
      exposure:
        include: shutdown


// 配置controller
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PreDestroy;

@RestController
public class EpidemicController {

    private static final Logger logger = LoggerFactory.getLogger(EpidemicController.class);

    @Test
    @GetMapping("/test")
    public String test(){
        return "test";
    }
	//  为控制类定义对应的销毁方法
    @PreDestroy
    public void preDestroy(){
        System.out.print("controller is destroy");
    }

}

启动并访问测试接口,访问正常
启动并访问接口
使用post访问actuator提供的关闭接口,这里我用idea的控制台进行post访问

curl -X POST http://localhost:8081/epidemic/actuator/shutdown

关闭成功
系统正常退出,并且调用了定义好的销毁方法
在这里插入图片描述
2. 获取程序启动时候的context,然后关闭主程序启动时的context

// 构建application的时候,将启动时的ConfigurableApplicationContext保存为静态变量,然后在接口中进行关闭


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class EpidemicApplication {
    public static ConfigurableApplicationContext ctx;
    public static void main(String[] args) {
        ctx = SpringApplication.run(EpidemicApplication.class,args);
    }
}

import cn.edu.dgut.EpidemicApplication;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PreDestroy;

@RestController
public class EpidemicController {

    private static final Logger logger = LoggerFactory.getLogger(EpidemicController.class);

    @GetMapping("/test")
    public String test(){
        return "test";
    }

    @PreDestroy
    public void preDestroy(){
        System.out.print("controller is destroy");
    }

// 在接口中调用的时候进行关闭

    @GetMapping("/shutdown")
    public void shutdown(){
        System.out.print("shutdown project");
        EpidemicApplication.ctx.close();
    }

}

结果:程序正常退出
在这里插入图片描述
3. SpringBoot启动的时候将进程号写入一个app.pid文件

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.ApplicationPidFileWriter;

@SpringBootApplication
public class EpidemicApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(EpidemicApplication.class);
        // 添加一个pid监听器,将pid写入文件中
        // cat /root/java/test/app.pid | xargs kill将程序关闭
        application.addListeners(new ApplicationPidFileWriter("/root/java/test/app.pid"));
        application.run(args);
    }

}

通过cat /root/java/test/app.pid | xargs kill将程序关闭
在这里插入图片描述
参考链接:https://mp.weixin.qq.com/s/oDVaem4rY8AemFEgIZEfdQ

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot提供了多种方式来实现优雅停机。其中一种方式是使用SpringBoot的actuator功能。通过引入actuator的maven依赖,我们可以开启actuator的shutdown功能。具体操作是在pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` 开启actuator的shutdown功能后,可以通过发送POST请求到`/actuator/shutdown`来触发优雅停机操作。这样可以确保在应用程序完成当前请求后才停止。 另外一种方式是使用第三方的starter库,如`hiatus-spring-boot`、`grace-shutdown`、`graceful-shutdown-spring-boot`等。这些库提供了更多的功能和配置选项,使得优雅停机操作更加灵活和方便。可以根据需求选择合适的库来实现优雅停机。 需要注意的是,如果使用内置的Tomcat服务器,通常需要编写代码来支持优雅停机。在这种情况下,可以参考一些在线文章和官方文档来了解如何实现优雅停机操作。 以上引用内容提供了关于SpringBoot优雅停机的不同方法和工具的信息,可以根据具体需求选择合适的方式来实现优雅停机。123 #### 引用[.reference_title] - *1* *3* [SpringBoot系列: 如何优雅停止服务](https://blog.csdn.net/weixin_34197488/article/details/86032084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [Springboot 优雅停止服务的几种方法](https://blog.csdn.net/weixin_44460333/article/details/104035539)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值