当前位置:   article > 正文

Spring Boot 服务优雅关闭/下线方式汇总, Spring Boot 打包排除指定文件_springboot actuator shutdown

springboot actuator shutdown

目录

服务优雅关闭 与 暴力关闭

Actuator shutdown 优雅关闭服务

ConfigurableApplicationContext 关闭服务

Spring Boot 服务打包排除指定文件


服务优雅关闭 与 暴力关闭

1、使用 Spring Boot 服务时,都要涉及到服务的停止和启动,停止服务很多时候大家都是 kill -9 暴力杀掉进程,而很多时候都需要安全的将服务停止,把没有处理完的工作继续处理完成,比如停止一些依赖的服务,输出一些日志,发一些信号给其他的应用系统等等,这在保证系统的高可用是非常有必要的。

2、优雅关闭服务:

第一步:停止接收请求和内部线程。
第二步:判断是否有线程正在执行。
第三步:等待正在执行的线程执行完毕。
第四步:停止容器。

3、为了能明显看到服务关闭,在启动类中加上  @PreDestroy 标识的方法(可以在任意 bean 中添加 @PreDestroy),服务关闭的时候会销毁 Bean,销毁时就会调用 bean 中 PreDestroy 标识的方法。

  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import javax.annotation.PreDestroy;
  6. /**
  7. * @author wangmaoxiong
  8. */
  9. @SpringBootApplication
  10. public class MybatisStudyApplication {
  11. private static final Logger logger = LoggerFactory.getLogger(MybatisStudyApplication.class);
  12. public static void main(String[] args) {
  13. SpringApplication.run(MybatisStudyApplication.class, args);
  14. }
  15. /**
  16. * 服务关闭的时候会销毁 Bean,此时就会调用 bean 中 PreDestroy 标识的方法
  17. */
  18. @PreDestroy
  19. public void shutdownApp() {
  20. logger.info("应用关闭!");
  21. }
  22. }

Actuator shutdown 优雅关闭服务

1、Spring Boot Actuator 提供的 shutdown  端点允许应用以优雅的方式关闭。

一:导入 Actuator  依赖

  1. <!--监控和管理应用程序-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-actuator</artifactId>
  5. </dependency>

二:启用 shutdown 端点并公开

  1. management:
  2. endpoint:
  3. shutdown:
  4. enabled: true #启用 shutdown 端点,默认是未启用的
  5. endpoints:
  6. web:
  7. exposure:
  8. include: health,info,shutdown #对外公开 health,info,shutdown 端点,默认只会公开前两个

三:post 访问 shutdown 端点即可优雅关闭服务:http://127.0.0.1:8080/actuator/shutdown

更多 Actuator 可参考:Spring Boot Actuator 监控和管理应用程序

ConfigurableApplicationContext 关闭服务

1、获取 Spring boot 服务启动时候的 ConfigurableApplicationContext,其中提供了关闭应用的方法。

  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.context.ConfigurableApplicationContext;
  6. import javax.annotation.PreDestroy;
  7. /**
  8. * @author wangmaoxiong
  9. */
  10. @SpringBootApplication
  11. public class MybatisStudyApplication {
  12. /**
  13. * 获取启动类中 SpringApplication.run 方法返回的配置应用上下文
  14. * 为了操作方便,这里直接作为静态成员变量存储,需要使用的时候,直接 类名.变量名
  15. */
  16. public static ConfigurableApplicationContext configurableApplicationContext;
  17. public static void main(String[] args) {
  18. configurableApplicationContext = SpringApplication.run(MybatisStudyApplication.class, args);
  19. }
  20. }

2、对外提供一个关闭服务的接口:

  1. import com.wmx.mybatisstudy.MybatisStudyApplication;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. /**
  7. * @author wangMaoXiong
  8. * @version 1.0
  9. * @date 2020/10/19 19:36
  10. */
  11. @RestController
  12. public class AppController {
  13. private static Logger logger = LoggerFactory.getLogger(AppController.class);
  14. /**
  15. * http://127.0.0.1:8080/app/shutdown
  16. *
  17. * @return
  18. */
  19. @GetMapping("app/shutdown")
  20. public void shutdown() {
  21. logger.info("用户手动请求关闭服务.");
  22. MybatisStudyApplication.configurableApplicationContext.close();
  23. }
  24. }

Spring Boot 服务打包排除指定文件或目录

1、Spring boot 应用打包时忽略某些文件或者目录,本文环境 Java JDK 1.8 + Spring Boot 2.1.3。

2、亲测在 pom.xml 中使用 <resources> <excludes> 无法排除,需要借助 maven-jar-plugin 插件才行。

  1. <build>
  2. <plugins>
  3. <!--Spring Boot 应用 Maven 打包插件(如果下面 maven-jar-plugin 需要排除启动类,则自己必须注释掉,否则可以不用注释) -->
  4. <!--<plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. </plugin>-->
  8. <plugin>
  9. <groupId>org.apache.maven.plugins</groupId>
  10. <artifactId>maven-jar-plugin</artifactId>
  11. <configuration>
  12. <excludes>
  13. <!-- 排除启动类(此时必须将 spring-boot-maven-plugin 注释掉,否则打包报错,因为它需要启动类) -->
  14. <!-- 不排除启动类时,spring-boot-maven-plugin 可以不用注释掉 -->
  15. <exclude>com/wmx/wmxredis/WmxRedisApplication.class</exclude>
  16. <!-- 排除com.wmx包下所有以Controller结尾的控制层(两个星号表示任意级次,一个星表示任意字符) -->
  17. <exclude>com/wmx/**/*Controller.class</exclude>
  18. <!-- 排除com.wmx包下所有controller目录下的文件 -->
  19. <exclude>com/wmx/**/controller/**</exclude>
  20. <!-- 排除com.wmx包下的RedisConfig配置类 -->
  21. <exclude>com/wmx/**/RedisConfig.class</exclude>
  22. <!-- 排除 /resources 路径下的资源文件 -->
  23. <exclude>*.yml</exclude>
  24. <exclude>*.properties</exclude>
  25. <exclude>*.txt</exclude>
  26. <exclude>*.sh</exclude>
  27. <exclude>static/**</exclude>
  28. <exclude>public/**</exclude>
  29. </excludes>
  30. </configuration>
  31. </plugin>
  32. </plugins>
  33. </build>

 源码:pom-exlude.xml · 汪少棠/wmx-redis - Gitee.com

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/334229
推荐阅读
相关标签
  

闽ICP备14008679号