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);
    }
}
相关文章
|
3月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
936 1
|
6月前
|
Java 开发工具 Spring
【Azure Application Insights】为Spring Boot应用集成Application Insight SDK
本文以Java Spring Boot项目为例,详细说明如何集成Azure Application Insights SDK以收集和展示日志。内容包括三步配置:1) 在`pom.xml`中添加依赖项`applicationinsights-runtime-attach`和`applicationinsights-core`;2) 在main函数中调用`ApplicationInsights.attach()`;3) 配置`applicationinsights.json`文件。同时提供问题排查建议及自定义日志方法示例,帮助用户顺利集成并使用Application Insights服务。
171 8
|
10月前
|
决策智能 数据库 开发者
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案
本项目旨在解决智能体的“超级入口”问题,通过开发基于意图识别的多智能体框架,实现用户通过单一交互入口使用所有智能体。项目依托阿里开源的Qwen2.5大模型,利用其强大的FunctionCall能力,精准识别用户意图并调用相应智能体。 核心功能包括: - 意图识别:基于Qwen2.5的大模型方法调用能力,准确识别用户意图。 - 业务调用中心:解耦框架与业务逻辑,集中处理业务方法调用,提升系统灵活性。 - 会话管理:支持连续对话,保存用户会话历史,确保上下文连贯性。 - 流式返回:支持打字机效果的流式返回,增强用户体验。 感谢Qwen2.5系列大模型的支持,使项目得以顺利实施。
3121 8
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案
|
10月前
|
缓存 NoSQL Java
Spring Boot中的分布式缓存方案
Spring Boot提供了简便的方式来集成和使用分布式缓存。通过Redis和Memcached等缓存方案,可以显著提升应用的性能和扩展性。合理配置和优化缓存策略,可以有效避免常见的缓存问题,保证系统的稳定性和高效运行。
306 3
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
1117 11
|
Java 微服务 Spring
springBoot:@Enable&@import&事件监听 (六)
本文介绍了如何在Spring Boot项目中实现跨项目获取Bean类的方法,包括创建两个项目、在pom文件中导入依赖、定义Bean和配置类、封装注解@EnableStudent以简化导入过程。同时,详细讲解了@Import的四种用法,并展示了如何通过实现ApplicationRunner、CommandLineRunner接口及配置spring.factories文件来执行程序启动时的监听逻辑。
157 2
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
1260 6
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
407 0
|
缓存 监控 NoSQL
SpringBoot配置第三方专业缓存技术jetcache方法缓存方案
SpringBoot配置第三方专业缓存技术jetcache方法缓存方案
876 1