如何在项目启动过程中对启动成功或启动失败,做一些操作?

发布时间:2023年12月27日

前言

我在这家公司也有几年了,经过这几年的问题积累,发现线上有时候项目会无缘无故的重启,而且重启后,开发也没有收到通知,这绝对是个隐患,所以需要找到问题所在,除了这个问题外,还有在启动过程中,项目启动失败,开发人员也不知道,在测试的时候发现功能出错,去看日志,才知道项目没有启动成功,所以想能不能在启动过程中,例如不同的时间点做一些操作。

实现方案

因为我们使用的SpringBoot,SpringBoot已经提供了在启动过程中,让接入者自定义扩展的功能,核心类如下:SpringApplicationRunListener,这个类提供了在启动过程中不同的生命周期执行的不同方法,而我想要的就是在启动成功和启动失败后做一些通知。

代码如下

/**
 * @author lwh
 * @date 2023/12/27
 * @description 自定义创建执行监听器
 **/
public class MySpringFactoryApplicationRunListener implements SpringApplicationRunListener {

    private String applicationName;
    private Env env;

    public MySpringFactoryApplicationRunListener(SpringApplication application, String[] args) {
    }

    @Override
    public void starting() {
    }

    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) {
        applicationName = environment.getProperty("spring.application.name");
        env = ApolloInjector.getInstance(ConfigUtil.class).getApolloEnv();
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
    }

    @SneakyThrows
    @Override
    public void started(ConfigurableApplicationContext context) {
        String applicationName = context.getEnvironment().getProperty("spring.application.name");
        if (StrUtil.isNotBlank(applicationName)) {
            InetAddress address = InetAddress.getLocalHost();
            String hostAddress = address.getHostAddress();
            String msg = String.format("Service:%s Env:%s Started... IP:%s ", applicationName, env.name(), hostAddress);
            DingDingUtil.sendMarkDownNoMobile(applicationName, msg, null);
        }
    }

    @Override
    public void running(ConfigurableApplicationContext context) {
    }

    @SneakyThrows
    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        String msg = String.format("Service:%s Env:%s Startup Failed...", applicationName, env.name());
        DingDingUtil.sendMarkDownNoMobile(applicationName, msg, ExceptionUtil.getSimpleMessage(exception));
    }
}

结尾

其中我在environmentPrepared方法中,获取了spring.application.name项目变量,目的就是在发送通知的时候知道是哪个项目,如果直接在failed方法中获取变量,是获取不到的,因为环境还没有初始化完毕,其中在这个类中,我引入了一些钉钉通知、获取Apollo环境,这些功能可以自己扩展。

文章来源:https://blog.csdn.net/l848168/article/details/135251734
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。