SpringBoot3:ApplicationAvailability监控应用程序可用性状态[官方文档]

一、基本概念

Liveness(存活状态):应用是否正常运行(没崩溃、没死锁)
Readiness(就绪状态):应用是否准备好接收流量(初始化完成、依赖加载成功)
ApplicationAvailability:Spring 提供的官方接口,用于获取 / 监听这两个状态

二、代码案例

利用监听器注解,在项目启动时,监听,通过ApplicationAvailability获取应用程序的可用性状态,并对应处理。

java 复制代码
package com.pzj.springboot3.demos.states;

import jakarta.annotation.Resource;
import org.springframework.boot.availability.ApplicationAvailability;
import org.springframework.boot.availability.AvailabilityChangeEvent;
import org.springframework.boot.availability.LivenessState;
import org.springframework.boot.availability.ReadinessState;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

/**
 * 自定义Bean,通过 ApplicationAvailability 获取应用可用性状态
 */
@Component
public class AppAvailabilityMonitor {

	// 1. 直接注入 Spring 提供的 ApplicationAvailability
	@Resource
	private ApplicationAvailability applicationAvailability;

	// ====================== 主动获取当前状态 ======================
	public void checkCurrentState() {
		// 获取存活状态(Liveness)
		LivenessState livenessState = applicationAvailability.getLivenessState();
		// 获取就绪状态(Readiness)
		ReadinessState readinessState = applicationAvailability.getReadinessState();

		System.out.println("当前应用存活状态:" + livenessState);
		System.out.println("当前应用就绪状态:" + readinessState);
	}

	// ====================== 监听状态变化(推荐) ======================
	/**
	 * 监听 存活状态(Liveness) 变化
	 */
	@EventListener
	public void onLivenessChange(AvailabilityChangeEvent<LivenessState> event) {
		LivenessState state = event.getState();
		System.out.println("【存活状态变更】:" + state);

		// 业务逻辑:比如应用挂了时告警、宕机时释放资源
		if (state == LivenessState.BROKEN) {
			System.err.println("应用异常,已停止服务!");
		}
	}

	/**
	 * 监听 就绪状态(Readiness) 变化
	 */
	@EventListener
	public void onReadinessChange(AvailabilityChangeEvent<ReadinessState> event) {
		ReadinessState state = event.getState();
		System.out.println("【就绪状态变更】:" + state);

		// 业务逻辑:应用就绪后初始化任务、加载缓存、注册服务
		if (state == ReadinessState.ACCEPTING_TRAFFIC) {
			System.out.println("应用已就绪,可以接收流量!");
			initBusinessTask();
		}
	}

	// 模拟业务初始化
	private void initBusinessTask() {
		System.out.println("执行业务初始化:加载配置、预热缓存...");
	}
}
相关推荐
自强的小白16 分钟前
nacos配置中心面试题(导入配置的优先级),注意是如果后导入相同配置是以 后导入优先。外部入优先和nacos的数据隔离。
java·微服务
Wang's Blog17 分钟前
Java框架 SpringCloud 快速入门: Feign 的自定义配置与日志级别
java·开发语言·spring cloud
成旭先生28 分钟前
企业全景信息查询 API:工商照面 33 项、股东出资、变更与社保一次查全
java·开发语言·api接口·企业信息查询·工商数据·风控尽调·供应商准入
她的男孩1 小时前
分片上传的大文件人人可下载:文件模块 isPrivate 在合并时被抹成 false,另有 4 个静默坑
java·后端·架构
SWAGGY..1 小时前
【C++进阶】:(7)红黑树的原理与 C++ 实现:结构设计、插入调整及性质验证
android·java·开发语言·c++·算法
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: Eureka 服务发现与服务名调用改造
java·spring cloud·eureka
夕除1 小时前
redis--OpenResty
java·redis
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: Eureka 注册中心原理分析
java·spring cloud·eureka
她说彩礼65万1 小时前
C语言 assert
java·linux·c语言
vx-程序开发2 小时前
【计算机毕设】52744基于微信小程序的民宿智能预订系统
java·spring boot·毕业设计·源码·课程设计·毕设·大作业