1.背景
springboot-3.1.5
ApplicationAvailability
LivenessState
ReadinessState
AvailabilityChangeEvent
我们可以通过ApplicationAvailability获取当前应用程序的可用性,这个可用性包括ApplicationContext和对外请求路由两种。
LivenessState
是表示ApplicationContext的状态
ReadinessState
是表示路由请求是否可使用的状态
可以解决的问题:
在应用程序内对ApplicationContext和路由请求是否正常运行进行监听
使用场景:
通过监听ReadinessState状态,判断服务是否启动成功,然后通过飞书或者钉钉或者企业微信进行服务重启通知
监听服务是否可用
@Component
public class ApplicationAvailabilityExporter {
@EventListener
public void onStateChange(AvailabilityChangeEvent event) {
AvailabilityState state = event.getState();
if (state.equals(ReadinessState.ACCEPTING_TRAFFIC)) {
System.out.println("应用程序已经可以接受外部请求");
} else if (state.equals(ReadinessState.REFUSING_TRAFFIC)) {
// kill -9 pid (强杀) 不会触发
// kill -2 pid (退出信号通知)可以出发
System.out.println("应用程序拒绝接受外部请求");
} else if (state.equals(LivenessState.BROKEN)) {
System.out.println("ApplicationContext未就绪");
} else if (state.equals(LivenessState.CORRECT)) {
System.out.println("ApplicationContext已构建完成处于就绪");
}
}
}
注意事项
PostContruct,CommandLineRunner,ApplicationRunner。
这三个都能用来处理一些业务配置等初始化的问题,其中PostContruct是在ApplicationContext的构建阶段,也就是BROKEN阶段,这个时候ApplicationContext还没有构建完成,而CommandLineRunner和ApplicationRunner是在CORRECT和REFUSING_TRAFFIC阶段,这也就意味ApplicationContext已经构建完成但是路由请求还没进来。
所以一般业务数据和配置的缓存建议放在CommandLineRunner和ApplicationRunner中。