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);
    }
}
相关文章
|
17天前
|
缓存 NoSQL Java
Spring Boot中的分布式缓存方案
Spring Boot提供了简便的方式来集成和使用分布式缓存。通过Redis和Memcached等缓存方案,可以显著提升应用的性能和扩展性。合理配置和优化缓存策略,可以有效避免常见的缓存问题,保证系统的稳定性和高效运行。
35 3
|
2月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
2月前
|
Java 微服务 Spring
springBoot:@Enable&@import&事件监听 (六)
本文介绍了如何在Spring Boot项目中实现跨项目获取Bean类的方法,包括创建两个项目、在pom文件中导入依赖、定义Bean和配置类、封装注解@EnableStudent以简化导入过程。同时,详细讲解了@Import的四种用法,并展示了如何通过实现ApplicationRunner、CommandLineRunner接口及配置spring.factories文件来执行程序启动时的监听逻辑。
|
2月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
310 10
|
2月前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
162 6
|
2月前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
56 0
|
4月前
|
Java 测试技术 Spring
Java SpringBoot 加载 yml 配置文件中字典项
Java SpringBoot 加载 yml 配置文件中字典项
49 0
|
4月前
|
Java 数据格式
SpringBoot 读取 yml 配置的几种方式
SpringBoot 读取 yml 配置的几种方式
264 0
|
4月前
|
Java
SpringBoot yml 小格子 变 小叶子
SpringBoot yml 小格子 变 小叶子
35 0
|
6月前
|
缓存 NoSQL Java
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
118 5