SpringBoot内置Tomcat配置
####1. 常用配置
server:
# 服务http端口
port: 8080
# tomcat配置
tomcat:
# 最大线程数
max-threads: 6
# 最小线程数
min-spare-threads: 3
# 队列长度
accept-count: 10
# 最大链接数
max-connections: 1000
#链接建立超时时间
connection-timeout: 10000
2.内置配置生效流程
-
内置tomcat的配置是通过
ServerProperties
来读取配置的,可以根据该类的属性来反推yml文件的配置字段。 -
通过
EmbeddedServletContainerCustomizerBeanPostProcessor
将我们在yml配置文件中设置的配置与TomcatEmbeddedServletContainerFactory
进行绑定。绑定的具体过程如下:
这里最后会调用
ServerProperties
的customize
方法,该方法就是绑定的具体执行者,将ConfigurableEmbeddedServletContainer
实际也就是TomcatEmbeddedServletContainerFactory
丢到方法中,层层将我们从yml读到的配置设置进去。注意,此处的思路的思路是有借鉴意义的,让我们有一个配置文件,另外有对象需要赋值属性时,可以提供一个方法,将被赋值作为参数放入
-
最后
TomcatEmbeddedServletContainerFactory
会调用getEmbeddedServletContainer方法去初始化,最开始得到的是一个默认的connector,同样用customizeConnector
方法将我们前面设置的参数初始化进去,至此就完成了。
3.直接用类来配置
用类直接来配置的方法有三种,但是要注意不要和上面的文件配置混用,避免出现问题。
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.context.embedded.EmbeddedServletContainer;
import org.springframework.boot.context.embedded.ServletContextInitializer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.stereotype.Component;
@Component()
public class MyEmbeddedServletContainerFactory extends TomcatEmbeddedServletContainerFactory
{
public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... initializers)
{
//设置端口
this.setPort(8081);
return super.getEmbeddedServletContainer(initializers);
}
protected void customizeConnector(Connector connector)
{
super.customizeConnector(connector);
Http11NioProtocol protocol = (Http11NioProtocol)connector.getProtocolHandler();
//设置最大连接数
protocol.setMaxConnections(2000);
//设置最大线程数
protocol.setMaxThreads(2000);
protocol.setConnectionTimeout(30000);
}
}
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebServerConfiguration
{
@Bean
public EmbeddedServletContainerFactory createEmbeddedServletContainerFactory()
{
TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
tomcatFactory.setPort(8081);
tomcatFactory.addConnectorCustomizers(new MyTomcatConnectorCustomizer());
return tomcatFactory;
}
}
class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer
{
public void customize(Connector connector)
{
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
//设置最大连接数
protocol.setMaxConnections(2000);
//设置最大线程数
protocol.setMaxThreads(2000);
protocol.setConnectionTimeout(30000);
}
}
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebServerConfiguration
{
@Bean
public EmbeddedServletContainerCustomizer createEmbeddedServletContainerCustomizer()
{
return new MyEmbeddedServletContainerCustomizer();
}
}
class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer
{
public void customize(ConfigurableEmbeddedServletContainer container)
{
TomcatEmbeddedServletContainerFactory tomcatFactory = (TomcatEmbeddedServletContainerFactory)container;
tomcatFactory.setPort(8081);
//下面的操作可以参照上面的方法
}
}
从上面的三种方法可以看出,实际大同小异,核心思路就是改写TomcatEmbeddedServletContainerFactory
中的相关配置。一是继承TomcatEmbeddedServletContainerFactory
、二是直接自己new一个、三则是替换EmbeddedServletContainerCustomizer
。