优雅关闭SpringBoot项目-接口方式

2023-05-16

前言

一般在服务器重新部署SpringBoot项目,无非就是用kill -9暴力停止进程,但会造成很多数据问题,如果遇到一些耗时或者正在处理交易类的业务时,直接导致数据异常,严重会导致一些预想不到的后果。针对这种情况也有很多解决办法,我这里只列举接口的方式,感觉这是比较方便的做法,就算是把接口暴露到了外网,只需要在接口里面做好权限校验,也能防止被外部调用,保证接口的安全性。

实现

SpringBoot 官方文档上,已经告诉开发者只需要实现特定接口即可监听到项目启动成功与关闭时的事件,相关接口如下:

CommandLineRunner接口:当应用启动成功后但在开始接受流量之前,会回调此接口的实现类,也可以实现ApplicationRunner接口,工作的方式与CommandLineRunner与之类似。
DisposableBean接口:当应用正要被销毁前,会回调此接口的实现类,也可以使用@PreDestroy注解,被标记的方法也会被调用。
基于此流程,我们可以创建一个服务监听类,用于监听到项目启动成功与关闭时的回调服务,示例代码如下:

import org.springframework.beans.factory.DisposableBean;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class AppListener implements CommandLineRunner, DisposableBean {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("应用启动成功,预加载相关数据....");
        for (int i = 0; i < 30; i++){
            Thread.sleep(1000);
            System.out.println("业务---" + i);
        }
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("应用正在关闭,清理相关数据....");
    }

}

每一个SpringApplication在启用的时候,都会向JVM注册一个关闭钩子shutdownhook,以确保ApplicationContext在退出的时候,通过这个勾子通知JVM,实现服务正常的关闭。

新建一个controller用于关闭服务

@RestController
public class ShutdownController implements ApplicationContextAware {

    private ApplicationContext context;

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

    /**
     * 关闭服务
     */
    @GetMapping("/shutdown")
    public void shutdownContext() {
        ((ConfigurableApplicationContext) context).close();
    }
}

调用接口:http://localhost:8080/shutdown

此时会发现会等待项目的所有在运行的逻辑全部关闭后,再自动关闭整个服务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优雅关闭SpringBoot项目-接口方式 的相关文章

随机推荐

  • 【Ubuntu】记录Ubuntu缺少启动项问题

    今天突然发现自己装的Ubuntu没有启动项 xff0c 也就是没有那个EFI分区 xff0c 人都麻了 xff01 原因是先把装Ubuntu的固态拿了出来 xff0c 再装的win11 xff0c 结果win11可以用了 xff0c Ubu
  • 【SLAM学习】基于Pangolin绘制运动轨迹

    Pangolin库 是一个轻量级的跨平台视图控制库 xff0c 主要用于可视化 交互和调试三维数据 该库提供了一系列图形界面工具 xff0c 包括窗口 OpenGL渲染器 3D相机 图像显示等 xff0c 可以方便地进行三维数据可视化和交互
  • Groovy学习-IO/文件操作

    读取文件 读取文本文件并打印每一行文本 new File 39 39 39 a txt 39 eachLine line gt println line eachLine方法是Groovy为File类自动添加的方法 xff0c 同时提供多个
  • linux---线程池种类以及实现(固定数量)

    线程池是什么 一堆固定的数量的或者有最大数量限制的线程 43 任务队列 gt 用于我们并发处理请求 xff0c 避免了大量频繁的线程的创建和销毁的事件成本 xff0c 同时避免了峰值压力带来瞬间大量线程被创建资源耗尽 xff0c 程序奔溃的
  • 什么是线程池?为什么使用线程池?

    1 什么是线程池 xff1f 线程池和数据库连接池非常类似 xff0c 可以统一管理和维护线程 xff0c 减少没有必要的开销 2 为什么要使用线程池 xff1f 因为频繁的开启线程或者停止线程 xff0c 线程需要重新从cpu从就绪状态调
  • Java实现List按条件分成多个子List

    一 业务场景 相信很多开发的小伙伴都有遇到过需要对表按特定条件进行查询 xff0c 然后再进行归类 xff0c 比如 xff1a 对员工表进行检索 xff0c 然后分别按他们所在的部门进行归类 xff0c 一般的做法都是按部门唯一标识 xf
  • MySQL生成随机姓名

    CREATE DEFINER 61 96 root 96 64 96 localhost 96 FUNCTION 96 rand name 96 n int RETURNS varchar 16 CHARSET utf8 begin 初始化
  • RabbitMQ的安装教程

    本文介绍RabbitMQ在Linxu上的安装教程 一 下载相关安装包 相应的安装包可以从官网上 xff08 https www rabbitmq com xff09 进行下载 xff0c 也可以从我的网盘上下载 蓝奏云地址 xff1a ht
  • SpringBoot实现广州健康通疫苗预约提醒

    一 前言 终于轮到了打第二针疫苗的时候 xff0c 无奈每次打开 广州健康通 或 粤康通 小程序 xff0c 每次都是被预约完的状态 xff0c 广州人口众多 xff0c 说不定有很多人一直守在小程序前等着放号 xff0c 所以这篇文章就诞
  • 搭建SFTP服务器实现文件上传

    1 前言 最近一直在做数据迁移接口的开发 xff0c 涉及到大文件的远程下载与上传 xff0c 其实倒没有什么原理可言 xff0c 无非就是两台机器互连之后 xff0c 获得文件流然后进行传输 xff0c 不过在这过程也遇到过一些小坑 xf
  • SpringBoot整合RabbitMQ实现五种消息模型

    一 什么是消息队列 xff1f 消息 xff0c 可以理解为两个应用之间传递的数据 xff0c 数据可以是基本数据类型 xff0c 也可以是对象等 消息队列 xff0c 则是容器 xff0c 生产者产生的消息存放在这个容器里面 MQ的整个过
  • SpringBoot整合CXF框架实现Webservice服务端

    1 前言 近期接手一个10多年的老项目 xff0c 敲重点 xff0c 10多年 xff01 xff01 xff01 就是最纯粹的servlet技术 xff0c 貌似是从2008年运维到现在 xff0c 老项目终究会有被淘汰的这一天 xff
  • Windows下切换不同版本JDK

    1 前言 从四月份重新入职新公司以来 xff0c 主要负责两个项目的开发 xff0c 一个是10多年前的项目 xff0c 一个是2019年开始开发的项目 xff0c 这两个项目依赖于不同版本的JDK xff0c 一个是JDK6 xff0c
  • css实现圆形div旋转,如“已预约”效果

    lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt lt title gt lt head gt lt style g
  • c++---类和对象(六大默认成员函数)

    类中默认的六个成员函数构造函数析构函数拷贝构造函数赋值操作符重载取地址和const取地址操作符重载const成员函数 1 类中默认的六个成员函数 首先看看下面代码 class A int main A a return 0 这个代码并没有报
  • 微服务系列--nacos注册中心与服务发现

    1 前言 终究还是到了更新关于微服务相关博客的时候了 xff0c 经过挺长一段时间微服务的自主学习 xff0c 现在不敢说自己熟悉微服务 xff0c 但我也能略知一二 微服务嘛 xff0c 其实入门之后便会发现 xff0c 其实关于微服务相
  • 微服务系列--Ribbon负载均衡

    1 前言 这篇文章接上一篇文章进行开发 xff0c 上一篇整合完了Nacos xff0c 这篇来整合Ribbon Ribbon不属于SpringCloud Alibaba的东西 xff0c 而是基于Netflix Ribbon实现的 可以让
  • Centos7安装Jenkins

    将Jenkins存储库添加到yum repos xff0c 并安装Jenkins sudo wget O etc yum repos d jenkins repo http pkg jenkins ci org redhat jenkins
  • Jenkins自动化部署SpringBoot项目

    首先需要安装所需的两个插件 xff0c Maven Integration plugin 和 Publish Over SSH 在 系统配置 xff0c 将服务器信息配置到jenkins xff0c 我用的是腾讯云服务器 xff0c 所以将
  • 优雅关闭SpringBoot项目-接口方式

    前言 一般在服务器重新部署SpringBoot项目 xff0c 无非就是用kill 9暴力停止进程 xff0c 但会造成很多数据问题 xff0c 如果遇到一些耗时或者正在处理交易类的业务时 xff0c 直接导致数据异常 xff0c 严重会导