springboot 怎么优雅下线

简介: 在Spring Boot应用中,如果需要优雅地下线(即在应用关闭前完成一些操作,例如释放资源、保存数据等),可以使用SpringApplication.addListeners()方法来添加监听器,并在监听器中实现下线逻辑。例如:

在Spring Boot应用中,如果需要优雅地下线(即在应用关闭前完成一些操作,例如释放资源、保存数据等),可以使用SpringApplication.addListeners()方法来添加监听器,并在监听器中实现下线逻辑。例如:

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MyApp.class);
        app.addListeners(new ApplicationShutdownListener());
        app.run(args);
    }
}

public class ApplicationShutdownListener implements ApplicationListener<ContextClosedEvent> {
    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        // 在这里编写下线逻辑,例如释放资源、保存数据等
        System.out.println("应用正在关闭中...");
    }
}

在上面的例子中,我们创建了一个名为ApplicationShutdownListener的监听器,并实现了ApplicationListener接口,在onApplicationEvent()方法中编写下线逻辑。然后,通过SpringApplication.addListeners()方法将该监听器添加到应用程序中,这样就可以在应用程序关闭前执行下线逻辑了。

需要注意的是,ContextClosedEvent事件表示应用程序上下文关闭事件,包括WebApplicationContextApplicationContext。因此,如果应用程序是一个Web应用程序,可以使用SpringBootServletInitializer类来启动应用程序,或者使用SpringApplication.addListeners()方法添加ContextRefreshedEventContextClosedEvent监听器,以便在应用程序启动和关闭时执行相应的操作。


那怎么触发springboot应用关闭呢?

在使用kill命令杀死进程时,可能会导致应用程序无法正常关闭,造成资源泄露等问题。因此,建议在正式环境中使用kill命令之前,先尝试使用shutdown端点进行应用程序关闭。

在Spring Boot应用程序中,可以使用/actuator/shutdown端点来进行应用程序的优雅关闭。要启用该端点,需要在pom.xml文件中添加spring-boot-starter-actuator依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

添加依赖后,/actuator/shutdown端点就会自动被添加到应用程序中。当访问该端点时,应用程序将会进行优雅关闭流程,包括释放资源、保存数据等操作。需要注意的是,为了确保安全性,访问该端点需要进行身份认证,默认情况下只有localhost才能访问该端点。

在默认情况下,可以通过POST请求/actuator/shutdown端点来关闭应用程序。例如,在终端中可以使用以下命令来关闭应用程序:

curl -X POST localhost:8080/actuator/shutdown

actuator/shutdown 背后的原理是什么

/actuator/shutdown端点的背后原理是通过EndpointShutdownEndpoint两个类实现的。

Endpoint是Spring Boot提供的一种扩展机制,用于暴露应用程序的一些信息或操作。通常情况下,需要自定义Endpoint类并继承AbstractEndpoint,然后在应用程序中注册该Endpoint。例如:

@Component
public class MyEndpoint extends AbstractEndpoint<String> {
    public MyEndpoint() {
        super("my-endpoint");
    }

    @Override
    public String invoke() {
        // 在这里编写Endpoint的逻辑
        return "Hello, World!";
    }
}

在上面的例子中,我们创建了一个名为MyEndpointEndpoint类,并继承了AbstractEndpoint<String>类。在构造方法中,我们调用了父类的构造方法,并传递了Endpoint的ID。在invoke()方法中,我们编写了Endpoint的逻辑,并返回了一个字符串。然后,在应用程序中,可以使用@EndpointWebExtension@EndpointExtension注解来扩展Endpoint的功能。

ShutdownEndpoint则是Spring Boot提供的一个内置Endpoint,用于实现应用程序的优雅关闭。当访问/actuator/shutdown端点时,ShutdownEndpoint会自动调用SpringApplication.exit()方法,触发应用程序的关闭流程,包括释放资源、保存数据等操作。为了确保安全性,在默认情况下,访问/actuator/shutdown端点需要进行身份认证,只有localhost才能访问该端点。

在实现自定义Endpoint时,可以参考ShutdownEndpoint的实现方式,并使用SpringApplication.exit()方法来触发应用程序的关闭流程。需要注意的是,在实际应用中,应该根据实际情况来选择使用内置Endpoint还是自定义Endpoint来实现应用程序的优雅关闭。

目录
相关文章
|
负载均衡 监控 Dubbo
Spring boot 2.3优雅下线,距离生产还有多远?
对于任何一个线上应用,如何在服务更新部署过程中保证业务无感知是开发者必须要解决的问题,即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求,这使得无损下线成为应用生命周期中必不可少的一个环节。
18123 105
Spring boot 2.3优雅下线,距离生产还有多远?
|
8月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
8月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
8月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。
|
8月前
|
监控 安全 JavaScript
2025基于springboot的校车预定全流程管理系统
针对传统校车管理效率低、信息不透明等问题,本研究设计并实现了一套校车预定全流程管理系统。系统采用Spring Boot、Java、Vue和MySQL等技术,实现校车信息管理、在线预定、实时监控等功能,提升学校管理效率,保障学生出行安全,推动教育信息化发展。
|
8月前
|
人工智能 Java 关系型数据库
基于springboot的画品交流系统
本项目构建基于Java+Vue+SpringBoot+MySQL的画品交流系统,旨在解决传统艺术交易信息不透明、流通受限等问题,融合区块链与AI技术,实现画品展示、交易、鉴赏与社交一体化,推动艺术数字化转型与文化传播。
|
8月前
|
JavaScript Java 关系型数据库
基于springboot的高校运动会系统
本系统基于Spring Boot、Vue与MySQL,实现高校运动会报名、赛程安排及成绩管理的全流程信息化,提升组织效率,杜绝信息错漏与冒名顶替,推动体育赛事智能化发展。
|
8月前
|
JavaScript 安全 Java
基于springboot的大学生兼职系统
本课题针对大学生兼职信息不对称、权益难保障等问题,研究基于Spring Boot、Vue、MySQL等技术的兼职系统,旨在构建安全、高效、功能完善的平台,提升大学生就业竞争力与兼职质量。
|
8月前
|
JavaScript Java 关系型数据库
基于springboot的美食城服务管理系统
本系统基于Spring Boot、Java、Vue和MySQL技术,构建集消费者服务、商家管理与后台监管于一体的美食城综合管理平台,提升运营效率与用户体验。