SpringBoot内置Tomcat配置

文章目录

    • SpringBoot内置Tomcat配置
        • 2.内置配置生效流程
        • 3.直接用类来配置

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.内置配置生效流程

  1. 内置tomcat的配置是通过ServerProperties来读取配置的,可以根据该类的属性来反推yml文件的配置字段。

  2. 通过EmbeddedServletContainerCustomizerBeanPostProcessor将我们在yml配置文件中设置的配置与TomcatEmbeddedServletContainerFactory进行绑定。

    绑定的具体过程如下:

    这里最后会调用ServerPropertiescustomize方法,该方法就是绑定的具体执行者,将ConfigurableEmbeddedServletContainer实际也就是TomcatEmbeddedServletContainerFactory丢到方法中,层层将我们从yml读到的配置设置进去。

    注意,此处的思路的思路是有借鉴意义的,让我们有一个配置文件,另外有对象需要赋值属性时,可以提供一个方法,将被赋值作为参数放入

  3. 最后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

你可能感兴趣的:(SpringBoot)