事件监听
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
在开发中,可以将一些公共不会经常变化的配置在公共模块中通过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);
}
}