Spring Boot 停止服务的几种方法

Spring Boot 停止服务的几种方法

最近突然想到了优雅停止 SpringBoot 服务问题,在使用 SpringBoot 的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭。而且一些没有执行完的程序就会直接退出。
第一种
第一种就是Springboot提供的actuator的功能,它可以执行shutdown, health, info等,默认情况下,actuator的shutdown是disable的,我们需要打开它。首先引入acturator的maven依赖。

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

然后将shutdown节点打开,也将/actuator/shutdown暴露web访问也设置上,除了shutdown之外还有health, info的web访问都打开的话将management.endpoints.web.exposure.include=*就可以。将如下配置设置到application.properties里边。设置一下服务的端口号为3333。

server.port=3333
        management.endpoint.shutdown.enabled=true
        management.endpoints.web.exposure.include=shutdown

接下来,咱们创建一个springboot工程,然后设置一个bean对象,配置上PreDestroy方法。这样在停止的时候会打印语句。bean的整个生命周期分为创建、初始化、销毁,当最后关闭的时候会执行销毁操作。在销毁的方法中执行一条输出日志。

package com.hqs.springboot.shutdowndemo.bean;

import javax.annotation.PreDestroy;

/**
 * @author huangqingshi
 * @Date 2019-08-17
 */
public class TerminateBean {

    @PreDestroy
    public void preDestroy() {
        System.out.println("TerminalBean is destroyed");
    }

}
做一个configuration,然后提供一个获取bean的方法,这样该bean对象会被初始化。

package com.hqs.springboot.shutdowndemo.config;

import com.hqs.springboot.shutdowndemo.bean.TerminateBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author huangqingshi
 * @Date 2019-08-17
 */
@Configuration
public class ShutDownConfig {

    @Bean
    public TerminateBean getTerminateBean() {
        return new TerminateBean();
    }

}

在启动类里边输出一个启动日志,当工程启动的时候,会看到启动的输出,接下来咱们执行停止命令。

curl -X POST http://localhost:3333/actuator/shutdown
以下日志可以输出启动时的日志打印和停止时的日志打印,同时程序已经停止。是不是比较神奇。

第二种
第二种方法也比较简单,获取程序启动时候的context,然后关闭主程序启动时的context。这样程序在关闭的时候也会调用PreDestroy注解。如下方法在程序启动十秒后进行关闭。

/* method 2: use ctx.close to shutdown all application context */
        ConfigurableApplicationContext ctx = SpringApplication.run(ShutdowndemoApplication.class, args);

        try {
        TimeUnit.SECONDS.sleep(10);

        } catch (InterruptedException e) {
        e.printStackTrace();
        }

        ctx.close();

第三种
第三种方法,在springboot启动的时候将进程号写入一个app.pid文件,生成的路径是可以指定的,可以通过命令 cat /Users/huangqingshi/app.id | xargs kill 命令直接停止服务,这个时候bean对象的PreDestroy方法也会调用的。这种方法大家使用的比较普遍。写一个start.sh用于启动springboot程序,然后写一个停止程序将服务停止。

/* method 3 : generate a pid in a specified path, while use command to shutdown pid :
            'cat /Users/huangqingshi/app.pid | xargs kill' */
        SpringApplication application = new SpringApplication(ShutdowndemoApplication.class);
        application.addListeners(new ApplicationPidFileWriter("/Users/huangqingshi/app.pid"));
        application.run();

第四种
第四种方法,自己写一个Controller,然后将自己写好的Controller获取到程序的context,然后调用自己配置的Controller方法退出程序。通过调用自己写的/shutDownContext方法关闭程序:curl -X POST http://localhost:3333/shutDownContext。

package com.hqs.springboot.shutdowndemo.controller;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author huangqingshi
 * @Date 2019-08-17
 */
@RestController
public class ShutDownController implements ApplicationContextAware {

    private ApplicationContext context;

    @PostMapping("/shutDownContext")
    public String shutDownContext() {
        ConfigurableApplicationContext ctx = (ConfigurableApplicationContext) context;
        ctx.close();
        return "context is shutdown";
    }

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

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }
}

好了,springboot的优雅关闭方法也都实现好了,也有同学问,如何暴力停止呢,简单,直接kill -9 相应的PID即可。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot和Vue可以使用多种技术来构建系统,例如JavaScript、HTML、CSS、RESTful API等。另外,Spring Boot还可以利用Spring Framework框架,提供便捷的开发方式,来更好地对接Vue。 ### 回答2: Spring Boot是一个基于Spring框架的快速开发微服务的工具。它内置了许多常见的配置和依赖项,提供了一种简化开发流程的方式。关于Spring Boot的技术,主要有以下几个方面: 1. Spring框架:Spring Boot基于Spring框架,利用Spring框架的依赖注入、AOP等特性,可以方便地构建和管理应用程序的组件。 2. 自动化配置:Spring Boot通过自动配置的功能大大简化了应用程序的配置过程。它根据项目中所使用的各种依赖项和类路径来自动配置应用程序,减少了繁琐的配置工作。 3. 嵌入式服务器:Spring Boot内置了一些常用的嵌入式服务器,如Tomcat、Jetty等,使得应用程序可以方便地以独立的方式运行。 4. Actuator:Spring Boot提供了Actuator功能,可以实时监控和管理应用程序。通过Actuator,开发人员可以了解应用程序的状态、性能指标等信息,并可以进行运行时的管理操作。 Vue是一种流行的前端JavaScript框架,用于构建现代化的用户界面。它借鉴了Angular和React的一些思想,提供了一种响应式和组件化的开发方式。关于Vue的技术,主要有以下几个方面: 1. 响应式数据绑定:Vue使用了一种高效的响应式数据绑定机制,使得界面和数据之间可以保持实时同步。开发人员只需要关注数据的更新,而不需要手动更新DOM,大大简化了开发流程。 2. 组件化开发:Vue将用户界面划分为一系列独立的组件,每个组件都有自己的模板、逻辑和样式,方便了代码的组织和复用。组件之间可以嵌套和通信,形成复杂的界面结构。 3. 虚拟DOM:Vue使用了虚拟DOM的概念,将界面的变化先应用到虚拟DOM上,通过比较虚拟DOM和实际DOM的差异,最小化了DOM操作,提高了界面的渲染性能。 4. 单文件组件:Vue支持使用单文件组件的方式编写代码。单文件组件将一个组件的模板、逻辑和样式放在一个文件中进行组织,提高了开发效率和代码可读性。 综上所述,Spring Boot主要利用了Spring框架的功能和自动化配置来简化微服务的开发流程,而Vue则利用了响应式数据绑定、组件化开发以及虚拟DOM等技术来构建现代化的用户界面。 ### 回答3: Spring Boot是一个用于构建Java应用程序的框架,它整合了多个技术和组件。 首先,Spring Boot使用了Spring框架作为核心,它提供了依赖注入、面向切面编程、事务管理等功能。Spring Boot还利用了Spring MVC来处理Web请求和响应。 其次,Spring Boot的构建系统使用了Maven或者Gradle,这些是常用的构建工具。它们可以管理项目的依赖、编译代码、运行测试和打包发布应用程序。 Spring Boot还使用了嵌入式的Servlet容器,如Tomcat、Jetty或Undertow,用来运行Web应用程序。它们可以轻松地在开发环境中启动和停止Web服务,而无需独立安装和配置这些服务器。 另外,Spring Boot支持使用Spring Data JPA进行数据库操作,它简化了数据库访问的过程。它还可以结合其他数据存储技术,如Redis、MongoDB、Elasticsearch等。 对于前端开发,Vue是一个流行的JavaScript框架,用于构建现代化的用户界面。Vue提供了双向数据绑定、组件化、路由、状态管理等功能。 在Vue的构建系统中,通常使用Webpack作为打包工具,它可以将多个JavaScript和CSS文件打包成单个文件,以提高性能。 此外,Vue使用了NPM(Node Package Manager)来管理依赖项,通过NPM可以下载、更新和管理项目所需的各种库和插件。 最后,为了简化前后端的开发和交互,Spring Boot和Vue通常使用RESTful API进行通信。这种API遵循一组约定的规则,客户端可以通过HTTP请求和响应进行数据交互。 综上所述,Spring Boot和Vue构建系统运用了Spring框架、Maven或Gradle、嵌入式Servlet容器、Spring Data JPA、Vue框架、Webpack、NPM和RESTful API等技术。这些技术的整合使得开发人员可以更高效地开发和部署应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值