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