首页 > 其他分享 >关于SpringBoot应用的启动状态检查

关于SpringBoot应用的启动状态检查

时间:2023-05-13 21:57:47浏览次数:49  
标签:SpringBoot 检查 启动 springframework import org event

关于SpringBoot启动状态的检查

背景:

当项目由多个SpringBoot的jar包构成,为简化启动流程,写了一个启动脚本,执行脚本的start命令即可启动多个SpringBoot的jar包。原先的启动状态的判断是使用进程号和端口号来判断的,但是这种判断方式对于SpringBoot程序来说并不准确。当服务器的内存为32G时,通过以上的条件来判断启动状态时,会发生SpringBoot服务正在启动过程中,但是先占用了进程号和端口号,并没有准备好提供服务。此时,如果访问未启动完成的前端就会报错。

解决方案:

方案一:

SpringBoot程序启动完成,准备好提供服务的时间点是Started <应用名> in <启动时间> seconds (JVM running for <JVM 运行时间>) .

其中,<应用名> 为 Spring Boot 应用的名称,<启动时间> 为 Spring Boot 应用启动所花费的时间,单位为秒,<JVM 运行时间> 为 JVM 运行时间,单位为毫秒。

这条日志信息表明 Spring Boot 应用已经成功启动,并且可以开始接收请求和处理业务逻辑。

所以,可以通过监听 ApplicationStartedEvent 事件来获得启动成功的标志,例如:

测试项目目录如下,

image-20230513203338958

MyAppStartedEvent

package org.example.listener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class MyAppStartedEvent implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        long timestamp = event.getTimestamp();
        log.info("ApplicationStartedEvent 时间 : {}", timestamp);
        // sleep5秒,用来确认和ReadyEvent的顺序
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

MyAppReadyEvent

package org.example.listener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class MyAppReadyEvent implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        long timestamp = event.getTimestamp();
        log.info("ApplicationReadyEvent 时间 : {}", timestamp);
    }
}

App

package org.example;


import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@Slf4j
public class App
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class,args);
        log.info("hello world!");
    }
}

输出如下

image-20230513203821820

总结:

优点:灵活,通过监听事件,可以做到细化监听状态,执行的内容也可以做到定制化

缺点:需要实现具体的逻辑,例如实现与启动启动脚本进程之间的交互

方案二:

使用Actuator组件,用来判断服务的启动状态

使用示例:

pom文件中添加依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

在yml文件中配置监控的服务

这里不做配置,只做简单演示,如果需要详细配置,请阅读下方的参考

启动服务,访问对应ip:port/actuator/health 即可获取服务的状态

http://localhost:8080/actuator/health

image-20230513205935995

up为启动状态正常,否则为非正常。

总结:

优点:

  1. 简单使用不需要配置
  2. 可以同时监控其他组件,例如mongo、es之类的,需要配置
  3. 可以自定义健康状态检查

请根据项目的实际情况判断哪种方案更适合待解决的问题。

参考

  1. actuator使用的详细说明
  2. actuator的配置实例
  3. SpringBoot的启动停止监听

标签:SpringBoot,检查,启动,springframework,import,org,event
From: https://www.cnblogs.com/Sun-yuan/p/17398271.html

相关文章

  • springboot 低于 2.6 版本设置 SameSite=None,springboot 1.x set SameSite=none in em
    speingboot使用自带的tomcat运行,设置SameSite。springboot过低的版本没有SameSite的属性设置,升级到1.5.22版本后,虽然Rfc6265CookieProcessor有 setSameSiteCookies方法,但是方法逻辑有BUG,当不是None时才可以设置成功:SameSiteCookiessameSiteCookiesValue=thi......
  • Ubuntu22.04 将EFI启动分区迁移到另一块硬盘
    机器上有两块硬盘,一块已经安装了Win10,另一块新装Ubuntu22.04,在新硬盘上划分分区的时候,有分出256M给BOOTEFI,但是安装的时候没注意,启动分区不知道怎的跑到Windows所在的硬盘上了记录一下将/boot/efi分区迁移至Ubuntu所在硬盘,并创建Grub的记录.预留的boot......
  • Springboot 开启异步任务Async,邮件发送任务,定时任务
    异步任务1.主启动类开启异步注解 2.service目录下开启异步任务注解@ServicepublicclassAsyncService{@Async//异步任务注解的标志publicvoidhello(){try{Thread.sleep(3000);}catch(InterruptedExceptione){......
  • 多次重新初始化hadoop namenode -format后,DataNode或NameNode没有启动
    多次重新初始化hadoopnamenode-format后,DataNode或NameNode没有启动在搭建完hadoop集群后,需要对主节点进行初始化(格式化)其本质是清理和做一些准备工作,因为此时的HDFS在物理上还是存在的。而且主节点格式化操作只能进行一次。当我们不小心多次初始化,会导致启动hadoop集群时,主......
  • SpringBoot整合Mybatis
    SpringBoot整合MyBatisSpringBoot整合MyBatisSpringBoot是一个快速开发应用程序的框架,而MyBatis是一个提供ORM支持的优秀框架。在本文中,我们将学习如何将SpringBoot与MyBatis整合,以便我们能够更加轻松地开发Web应用程序。步骤创建新的SpringBoot项目。在pom.xml文件中添加My......
  • java基于springboot+vue的农机电招平台、农机租赁管理系统,附源码+数据库+文档+PPT,适合
    1、项目介绍该系统包括前台操作和后台管理两个部分,一方面,为用户提供首页,农机,系统公告,个人中心,后台管理等功能;另一方面,为管理员提供首页,个人中心,农机机主管理,使用者管理,农机类型管理,农机管理,农机预约管理,系统管理等功能。项目获取,看这里2、技术框架编程语言:java系统架构:B/S......
  • SpringBoot 依赖注入方式
    前置知识SpringDI(DependencyInjection)依赖注入:组件之间依赖关系由容器在运行期间决定,即由容器动态的将某个依赖关系注入到组件中谁依赖谁:应用程序依赖IOC容器为什么需要依赖:应用程序需要IOC容器提供对象需要的外部资源谁注入谁:IOC容器注入应用程序某个对象,应用程序依赖的......
  • nginx 并发限制limit_conn启动不了nginx
    直接在http下写limit_conn启动不了nginx基本语法limit_conn指令的基本语法为:limit_connconnlimit;1其中,connlimit为最大并发连接数。一旦某时刻,连接数超过该值,Nginx将返回503错误页面并关闭新连接的接入。使用error_page指令可对此页面进行自定义配置。除了主要指令之......
  • PLC做配方三轴螺丝机程序 配合流水线使用的三轴吸钉式自动锁螺丝机 (就是用流水线到位
    PLC做配方三轴螺丝机程序配合流水线使用的三轴吸钉式自动锁螺丝机(就是用流水线到位信号启动,螺丝机打完再输出信号:)显控触摸屏加三菱FX3GA已经在设备上使用。用PLC做的配方,打螺丝颗数1-10颗最大存储70个产品数据颗数和数据数程序可以改ID:1418656656907646......
  • SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤
    之前介绍了SpringBoot集成Jpa的简单使用,接下来介绍一下使用Jpa连接数据库对数据进行排序、分页、条件查询和过滤操作。首先创建Springboot工程并已经继承JPA依赖,如果不知道可以查看我的另一篇文进行学习,这里不做介绍。文章地址(https://www.cnblogs.com/eternality/p/17391141.html......