SpringBoot Application事件监听的实现方案(动态写入yml)

简介: SpringBoot Application事件监听的实现方案(动态写入yml)

事件监听


SpringBoot Application共支持6种事件监听,按顺序分别是:


ApplicationStartingEvent:在Spring最开始启动的时候触发

ApplicationEnvironmentPreparedEvent:在Spring已经准备好上下文但是上下文尚未创建的时候触发

ApplicationPreparedEvent:在Bean定义加载之后、刷新上下文之前触发

ApplicationStartedEvent:在刷新上下文之后、调用application命令之前触发

ApplicationReadyEvent:在调用applicaiton命令之后触发

ApplicationFailedEvent:在启动Spring发生异常时触发

另外:


ApplicationRunner和CommandLineRunner的执行在第五步和第六步之间

Bean的创建在第三步和第四步之间

在启动类中,执行SpringApplication.run()方法后的代码,会在第六步后执行


动态加载配置


这里通过不写yml,监听ApplicationEnvironmentPreparedEvent来实现,动态添加yml中的配置


PropertiesListener2

import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
@Configuration
public class PropertiesListener2 implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        ConfigurableEnvironment environment = event.getEnvironment();
        Properties props = new Properties();
        props.put("server.tomcat.threads.min-spare", 100);
        // 设置启动端口
        props.put("server.port", 8105);
        environment.getPropertySources().addFirst(new PropertiesPropertySource("myProps", props));
        PropertySource<?> myProps = PropertiesPropertySource.named("myProps");
    }
}


spring.factories

# 监听 ApplicationEvent 事件
org.springframework.context.ApplicationListener=com.thread.conf.PropertiesListener2

1673454517442.jpg

在开发中,可以将一些公共不会经常变化的配置在公共模块中通过ApplicationEnvironmentPreparedEvent进行加载,这样就不用在每个模块中去做配置


例如tomcat的配置

@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
    ConfigurableEnvironment environment = event.getEnvironment();
    Properties props = new Properties();
    //工作线程的最小数量
    props.put("server.tomcat.threads.min-spare", 50);
    //Tomcat线程池最大工作线程数
    props.put("server.tomcat.threads.max", 200);
    //超过maxThread数量,最大等待数
    props.put("server.tomcat.accept-count", 100);
    //服务器在任何给定时间接受和处理的最大连接数。一旦达到限制,操作系统仍然可以根据“acceptCount”属性接受连接,默认:8192
    //一瞬间最多能够处理的并发连接数,一个线程可以处理多个连接
    props.put("server.tomcat.max-connections", 10000);
    environment.getPropertySources().addFirst(new PropertiesPropertySource("myProps", props));
}


或者通过实现接口的方式自定义 Tomcat(供别的模块使用时,记得在spring.factories中配置)

@Configuration
public class TomcatConnectionCustomizer implements TomcatConnectorCustomizer{
    /**
     * 配置类: {@link org.springframework.boot.autoconfigure.web.ServerProperties}
     *
     * 查看线程数命令
     * <code>pstree -p pid | wc -l</code>
     */
    @Override
    public void customize(Connector connector) {
        connector.setPort(8105);
        // 连接协议处理器. 默认: org.apache.coyote.http11.Http11NioProtocol
        connector.setAttribute("protocol", "org.apache.coyote.http11.Http11Nio2Protocol");
        /* 参数设置-方式1 */
//        connector.setAttribute("minSpareThreads", 100);
//        connector.setAttribute("maxThreads", 800);
        /* 参数设置-方式2 */
        Http11NioProtocol protocolHandler = (Http11NioProtocol) connector.getProtocolHandler();
        // 最小工作线程数, 默认: 10(适当增大一些, 以便应对突然增长的访问量)
        protocolHandler.setMinSpareThreads(100);
        // 最大线程数, 默认: 200(4核8g内存, 线程数经验值800, 操作系统做线程之间的切换调度是有系统开销的, 所以不是越多越好)
        protocolHandler.setMaxThreads(800);
        // 等待队列长度, 默认100
        protocolHandler.setAcceptCount(1000);
        // 最大连接数, 默认: 10000
        protocolHandler.setMaxConnections(10000);
        // 连接超时时间, 默认: 60000
        protocolHandler.setConnectionTimeout(100);
        // 默认: 1
        protocolHandler.setAcceptorThreadCount(10);
        // 30秒内没有请求则服务端自动断开keepalive链接
        protocolHandler.setKeepAliveTimeout(300000);
        // 当客户端发送超过10000个请求则自动断开keepalive链接
        protocolHandler.setMaxKeepAliveRequests(10000);
    }
}
相关文章
|
4月前
|
小程序 数据可视化 Java
Java+后端Spring boot 开发的全套UWB定位方案,0.1米高精度定位系统源码
UWB定位系统由硬件定位设备、定位引擎和应用软件组成。该定位系统应用软件支持PC端和移动端访问,并提供位置实时显示、历史轨迹回放、人员考勤、电子围栏、行为分析、智能巡检等功能。定位精度高达10cm,同时具备高动态、高容量、低功耗的优点。应用场景包括:隧道、化工、工厂、煤矿、工地、电厂、养老、展馆、整车、机房、机场等。
89 8
|
2天前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
22 10
|
1天前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
|
2天前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
6 0
|
2月前
|
Java 测试技术 Spring
Java SpringBoot 加载 yml 配置文件中字典项
Java SpringBoot 加载 yml 配置文件中字典项
32 0
|
2月前
|
Java 数据格式
SpringBoot 读取 yml 配置的几种方式
SpringBoot 读取 yml 配置的几种方式
94 0
|
2月前
|
Java
SpringBoot yml 小格子 变 小叶子
SpringBoot yml 小格子 变 小叶子
24 0
|
4月前
|
缓存 NoSQL Java
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
95 5
|
4月前
|
缓存 监控 NoSQL
SpringBoot配置第三方专业缓存技术jetcache方法缓存方案
SpringBoot配置第三方专业缓存技术jetcache方法缓存方案
267 1
|
4月前
|
Java 数据库连接 开发者
SpringBoot实用开发篇第一章(yml配置文件操作)
SpringBoot实用开发篇第一章(yml配置文件操作)
下一篇
无影云桌面