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);
    }
}
相关文章
|
11天前
|
小程序 数据可视化 Java
Java+后端Spring boot 开发的全套UWB定位方案,0.1米高精度定位系统源码
UWB定位系统由硬件定位设备、定位引擎和应用软件组成。该定位系统应用软件支持PC端和移动端访问,并提供位置实时显示、历史轨迹回放、人员考勤、电子围栏、行为分析、智能巡检等功能。定位精度高达10cm,同时具备高动态、高容量、低功耗的优点。应用场景包括:隧道、化工、工厂、煤矿、工地、电厂、养老、展馆、整车、机房、机场等。
36 8
|
1月前
|
缓存 NoSQL Java
SpringBoot实现缓存预热的几种常用方案
SpringBoot实现缓存预热的几种常用方案
|
1月前
|
Java 调度 Spring
SpringBoot实现多线程定时任务动态定时任务配置文件配置定时任务
SpringBoot实现多线程定时任务动态定时任务配置文件配置定时任务
307 0
|
1月前
|
Java 数据库
SpringBoot手动取消接口执行方案
实际开发中经常会遇到比较耗时的接口操作,但页面强制刷新或主动取消接口调用后后台还是会继续运行,特别是有大量数据库操作时会增加服务器压力,所以进行研究测试后总结了一套主动取消接口调用的解决方案
42 0
|
1月前
|
Java C++
SpringBoot中的properties,yml,yaml的区别
SpringBoot中的properties,yml,yaml的区别
43 0
|
1月前
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
113 0
|
5天前
|
缓存 Java Maven
Spring Boot 启动错误:To display the conditions report re-run your application with ‘debug‘ enable —【已解决】
Spring Boot 启动错误:To display the conditions report re-run your application with ‘debug‘ enable —【已解决】
7 1
|
14天前
|
搜索推荐 前端开发 JavaScript
SpringBoot静态资源访问控制和封装集成方案
该文档描述了对基于SpringBoot的项目框架进行优化和整合的过程。原先采用前后端分离,后端兼做前端,但随着项目增多,升级维护变得复杂。因此,决定整合后台管理页面与后端代码,统一发布。设计上,框架包含后台管理资源,项目则配置具体业务页面,项目可通过覆盖框架资源实现个性化。关键步骤包括:自定义静态资源访问路径、解决图标与字体文件访问问题、设定自定义欢迎页面和页面图标,以及确保项目能正确访问框架静态资源。通过扫描jar包、解压和拷贝资源到项目目录,实现了框架静态资源的动态加载。此外,调整静态资源访问优先级,保证正确加载。最终实现支持jar和war包的项目结构优化。
50 4
|
25天前
|
Java 应用服务中间件 Maven
SpringBoot概述&SpringBoot基础配置&yml的使用&多环境启动
SpringBoot概述&SpringBoot基础配置&yml的使用&多环境启动
35 2
|
1月前
|
缓存 NoSQL Java
Springboot 大事务问题的常用优化方案
Springboot 大事务问题的常用优化方案