1. 程式人生 > >015-Spring Boot 定制和優化內嵌的Tomcat

015-Spring Boot 定制和優化內嵌的Tomcat

web容器 ffi add nec app ase class new ont

一、內嵌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

015-Spring Boot 定制和優化內嵌的Tomcat