zoukankan      html  css  js  c++  java
  • 015-Spring Boot 定制和优化内嵌的Tomcat

    一、内嵌web容器

      参看http://www.cnblogs.com/bjlhx/p/8372584.html

      查看源码可知提供以下三种:

        

    二、定制优化tomcat

    2.1、配置文件配置

      通过application.properties配置tomcat

      端口配置:server.port=10001
      地址配置:server.adress=192.168.1.1

         通过ServerProperties查看到tomcat变量,进入即可配置,如下

      启用日志配置:

    server.tomcat.accesslog.enabled=true
    server.tomcat.accesslog.directory=d:/logs

      原理分析  

      在spring-boot-autoconfigure-1.5.9.RELEASE.jar包中的org.springframework.boot.autoconfigure.web.ServerProperties查看

      可以查看到以上所示属性

    2.2、通过代码方式配置一-实现EmbeddedServletContainerCustomizer接口

      EmbeddedServletContainerCustomizer→三个具体默认实现

        

      1》代码方式自定义

      定义一个类MyEmbeddedServletContainerCustomizer实现EmbeddedServletContainerCustomizer接口,即可

      设置基本配置

    @Component
    public class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer {
    
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            System.out.println(container.getClass());
            TomcatEmbeddedServletContainerFactory factory =(TomcatEmbeddedServletContainerFactory)container;
            factory.setPort(8181);
            factory.setBaseDirectory(new File("d:/tmp/tomcat"));
        }
    }
    View Code

      设置日志

    package com.lhx.spring.springboot_web;
    
    import java.io.File;
    
    import org.apache.catalina.valves.AccessLogValve;
    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.stereotype.Component;
    
    @Component
    public class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer {
    
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            System.out.println(container.getClass());
            TomcatEmbeddedServletContainerFactory factory =(TomcatEmbeddedServletContainerFactory)container;
            factory.setPort(8181);
            factory.setBaseDirectory(new File("d:/tmp/tomcat"));
            
            factory.addContextValves(getAccessLogValve());
        }
        
        private AccessLogValve getAccessLogValve() {
            AccessLogValve log = new AccessLogValve();
            log.setDirectory("d:/tmp/logs");
            log.setEnabled(true);
            log.setPattern("common");
            log.setPrefix("spring-boot-lhx-access-log");
            log.setSuffix(".txt");
            return log;
            
        }
    }
    View Code

      设置连接数配置、最大线程

    package com.lhx.spring.springboot_web;
    
    import java.io.File;
    
    import org.apache.catalina.connector.Connector;
    import org.apache.catalina.valves.AccessLogValve;
    import org.apache.coyote.http11.Http11NioProtocol;
    import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
    import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
    import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
    import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer {
    
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            System.out.println(container.getClass());
            TomcatEmbeddedServletContainerFactory factory =(TomcatEmbeddedServletContainerFactory)container;
            factory.setPort(8181);
            factory.setBaseDirectory(new File("d:/tmp/tomcat"));
            
            factory.addContextValves(getAccessLogValve());
            
            factory.addConnectorCustomizers(new MyTomcatConnectorCustomizers());
        }
        
        private AccessLogValve getAccessLogValve() {
            AccessLogValve log = new AccessLogValve();
            log.setDirectory("d:/tmp/logs");
            log.setEnabled(true);
            log.setPattern("common");
            log.setPrefix("spring-boot-lhx-access-log");
            log.setSuffix(".txt");
            return log;        
        }
        
        
    }
    class MyTomcatConnectorCustomizers implements TomcatConnectorCustomizer{
    
        @Override
        public void customize(Connector connector) {
             Http11NioProtocol protocol =  (Http11NioProtocol)connector.getProtocolHandler();
             protocol.setMaxConnections(2000);
             protocol.setMaxThreads(500);
        }    
    }
    View Code

    2.5、通过代码方式配置二-默认配置类方式

    package com.lhx.spring.springboot_web;
    
    import org.springframework.boot.SpringBootConfiguration;
    import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
    import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
    import org.springframework.boot.web.servlet.ErrorPage;
    import org.springframework.context.annotation.Bean;
    import org.springframework.http.HttpStatus;
    
    @SpringBootConfiguration
    public class WebServletConfiguration {
        @Bean
        public EmbeddedServletContainerFactory createEmbeddedServletContainerFactory() {
            TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
            factory.setPort(1008);
            factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));
            return factory;
        }
    }
    View Code

      添加初始化

            factory.addInitializers((servletContext)->{
                System.out.println("----------servletContext startup----------");
            });

      此时可以获取到servletContext信息,可以进行添加Filter、设置Attribute等

       源码地址:https://github.com/bjlhx15/spring-boot.git

  • 相关阅读:
    [Keyence Programming Contest 2020 E] Bichromization
    [Gym101821B] LIS vs. LDS
    [Ynoi2010]iepsmCmq【数据结构】
    【集训队作业2018】喂鸽子
    【集训队作业2018】复读机
    【NOI2015】荷马史诗
    【IOI2018】组合动作
    【清华集训2017】榕树之心
    【清华集训2016】Alice和Bob又在玩游戏
    1209F
  • 原文地址:https://www.cnblogs.com/bjlhx/p/8672848.html
Copyright © 2011-2022 走看看