You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Spring Boot微服务自动重启的时间戳

答案

完全可以在当前微服务内部实现该需求,无需依赖外部服务或组件。

Spring Cloud Config 配置变更触发的应用重启,本质是Spring应用上下文的重载重启,整个重启过程的生命周期事件都会在微服务进程内正常抛出,你只需要绑定对应的生命周期节点,就能准确记录重启时的时间戳。


可直接落地的实现方式

1. 基础实现:记录所有重启/启动的时间戳

通过监听Spring Boot的应用就绪事件即可实现,不管是服务首次启动,还是配置变更触发的重启,上下文初始化完成、服务可以正常接收请求时,都会触发ApplicationReadyEvent,在事件处理逻辑中记录时间戳即可。

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class RestartTimeRecorder {
    // 存储最近一次重启的时间戳,可按需扩展为列表存储历史重启记录
    private long lastRestartTimestamp;

    @EventListener
    public void handleAppReady(ApplicationReadyEvent event) {
        lastRestartTimestamp = System.currentTimeMillis();
        // 按需扩展:打印日志、写入本地存储、暴露给监控接口均可
        System.out.printf("应用完成重启,时间戳:%d%n", lastRestartTimestamp);
    }

    public long getLastRestartTimestamp() {
        return lastRestartTimestamp;
    }
}

2. 扩展:区分配置变更触发的重启

如果需要把配置中心变更触发的重启和普通发布重启做区分,可以额外监听配置变更事件做标记:

import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class ConfigChangeMarker {
    // 标记下一次重启是否由配置中心变更触发
    public static volatile boolean isTriggerByConfigUpdate = false;

    @EventListener
    public void handleConfigChange(EnvironmentChangeEvent event) {
        isTriggerByConfigUpdate = true;
    }
}

在之前的RestartTimeRecorder的事件处理逻辑中,判断该标记值即可区分重启触发源,记录完时间戳后把标记重置为false即可。


注意事项

  • 不要通过静态代码块、类初始化逻辑记录时间:如果是Spring上下文级别的重启,不会重新初始化JVM加载的类,静态逻辑只会在服务首次启动时执行一次,拿到的时间戳不准。
  • 如果需要留存历史重启记录,不要把时间戳只存在内存变量中,可以在监听器逻辑里追加写入本地日志文件,避免进程完全退出后记录丢失。
  • 如果服务接入了Spring Boot Actuator,可以自定义info端点或者健康检查端点,把记录的重启时间戳暴露出去,方便监控系统采集告警。

内容的提问来源于stack exchange,提问作者user15499060

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:27:14