Spring 如何实现优雅停机

131 阅读2分钟

Spring Framework 提供了多种方式来实现优雅停机(graceful shutdown)以确保应用程序能够安全地关闭,释放资源并完成正在进行的操作。

以下是一些常用的方法:

  1. 使用 Spring Boot Actuator: Spring Boot Actuator 是 Spring Boot 提供的一个功能强大的模块,它包括了一些用于监控和管理应用程序的端点。通过配置 Actuator,您可以轻松实现优雅停机。在 Spring Boot 2.3 之后的版本,Actuator 默认包含了 /actuator/shutdown 端点,您可以向该端点发送 POST 请求来触发应用程序的关闭。您需要在 application.propertiesapplication.yml 文件中配置端点的安全性,以确保只有授权的用户可以访问。

例如,可以在 application.properties 中添加以下配置:

management.endpoints.web.exposure.include=health,info,shutdown
management.endpoint.shutdown.enabled=true

然后,通过发送 POST 请求到 /actuator/shutdown 端点,您可以优雅地停止应用程序。

  1. 使用Spring Boot2.3之前的版本: 如果您使用的是 Spring Boot 2.3 之前的版本,您可以通过配置一个关闭钩子(Shutdown Hook)来实现优雅停机。Spring Boot 在启动时默认会创建一个关闭钩子,您可以通过 springApplication.addListeners(new ApplicationPidFileWriter()) 来添加 PID 文件记录器,以记录应用程序的 PID。然后,您可以通过以下方式终止应用程序:
kill -15 <PID>

这会触发Spring Boot应用程序执行关闭操作,以确保资源的安全释放。

  1. 自定义停机逻辑: 如果需要执行一些自定义的停机逻辑,您可以创建一个 ApplicationListener 实现类,监听 ContextClosedEvent 事件。这个监听器可以包含您需要在应用程序关闭时执行的自定义代码。在监听器中,您可以释放资源、保存状态等操作。
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;

public class CustomShutdownListener implements ApplicationListener<ContextClosedEvent> {
    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        // 执行自定义停机逻辑
    }
}