前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shutdown SpringBoot App

Shutdown SpringBoot App

作者头像
程序那些事
发布2020-07-07 16:15:58
8040
发布2020-07-07 16:15:58
举报
文章被收录于专栏:程序那些事程序那些事

Shutdown SpringBoot App

Spring Boot使用ApplicationContext来创建,初始化和销毁所用的bean。本文将会讲解如何shut down一个spring boot应用程序。

Shutdown Endpoint

Spring Boot actuator自带了shutdown的endpoint。首先我们添加pom依赖:

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

接下来我们需要开启shutdown的配置:

代码语言:javascript
复制
management.endpoints.web.exposure.include=*
management.endpoint.shutdown.enabled=true

上面的配置对外暴露了 /shutdown 接口。我们可以直接这样调用:

代码语言:javascript
复制
curl -X POST localhost:8080/actuator/shutdown

close Application Context

我们也可以直接调用Application Context的close() 方法来关闭Application Context。

代码语言:javascript
复制
@SpringBootApplication
public class ConfigurableApp {

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = new
                SpringApplicationBuilder(ConfigurableApp.class).web(WebApplicationType.NONE).run();
        System.out.println("Spring Boot application started");
        ctx.getBean(TerminateBean.class);
        ctx.close();
    }
}

为了验证App是否被关闭,我们可以在TerminateBean中添加@PreDestroy来监测App是否被关闭:

代码语言:javascript
复制
@Component
public class TerminateBean {

    @PreDestroy
    public void onDestroy() throws Exception {
        System.out.println("Spring Container is destroyed!");
    }
}

这是程序的输出:

代码语言:javascript
复制
2020-02-03 23:12:08.583  INFO 30527 --- [           main] com.flydean.ConfigurableApp              : Started ConfigurableApp in 2.922 seconds (JVM running for 3.559)
Spring Boot application started
Spring Container is destroyed!

还有一种办法就是暴露close接口如下所示:

代码语言:javascript
复制
@RestController
public class ShutdownController implements ApplicationContextAware {

    private ApplicationContext context;

    @PostMapping("/shutdownContext")
    public void shutdownContext() {
        ((ConfigurableApplicationContext) context).close();
    }

    @Override
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        this.context = ctx;

    }
}

这样我们就可以通过/shutdownContext接口来关闭ApplicationContext。

退出SpringApplication

上篇文章我们讲过可以通过实现ExitCodeGenerator 接口来返回特定的exit code:

代码语言:javascript
复制
@SpringBootApplication
public class ExitCodeApp implements ExitCodeGenerator {
    public static void main(String[] args) {
        System.exit(SpringApplication.exit(SpringApplication.run(ExitCodeApp.class, args)));
    }

    @Override
    public int getExitCode() {
        return 11;
    }
}

从外部程序kill App

熟悉shell的同学都知道如果想在外部kill一个程序,需要知道该App的pid,Spring Boot也可以很方便的生成pid:

代码语言:javascript
复制
@SpringBootApplication
public class KillApp {
    public static void main(String[] args) {
        SpringApplicationBuilder app = new SpringApplicationBuilder(KillApp.class)
                .web(WebApplicationType.NONE);
        app.build().addListeners(new ApplicationPidFileWriter("./bin/shutdown.pid"));
        app.run();
    }
}

上面的程序将会在./bin/shutdown.pid生成应用程序的pid,供shell使用。

我们可以这样使用:

代码语言:javascript
复制
kill $(cat ./bin/shutdown.pid)

本文的例子可以参考 https://github.com/ddean2009/learn-springboot2/tree/master/springboot-shutdown

更多教程请参考 flydean的博客

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序那些事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Shutdown Endpoint
  • close Application Context
  • 退出SpringApplication
  • 从外部程序kill App
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档