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

前言

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

实现方案

因为我们使用的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环境,这些功能可以自己扩展。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术武器库

一句真诚的谢谢,胜过千言万语

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值