当前位置: 移动技术网 > IT编程>开发语言>Java > Spring Boot 定制与优化内置的Tomcat容器实例详解

Spring Boot 定制与优化内置的Tomcat容器实例详解

2019年07月19日  | 移动技术网IT编程  | 我要评论

1、spring boot 定制与优化内置tomcat容器。

> 内置的容器有三个分别是undertow、jetty、tomcat,spring boot 对这三个容器分别进行了实现,它们上层接口都是embeddedservletcontainerfactory,该接口也是本文的主要核心.

对于内置容器的定制与优化主要有两种方式,第一种方式是通过配置文件来配置,另外一种是通过码代码的方式.接下来主要对上述两种方式进行实现。

2、通过配置文件来定制与优化tomcat

> 配置的核心内容参考org.springframework.boot.autoconfigure.web.serverproperties这个服务属性类,下面展示部分对tomcat的配置

server:
 port: 8081
 # tomcat设置
 tomcat:
 accesslog:
 # 开启日志访问
  enabled: true
 # 日志保存路径
  directory: e:/tmp/logs

更多的配置内容参考org.springframework.boot.autoconfigure.web.serverproperties类内置属性。

3、通过码代码方式实现对内置容器的配置与优化

> 有两种方式显示用代码进行对内置容器进行优化与定制,第一种实现内置servlet容器定制器(org.springframework.boot.context.embedded.embeddedservletcontainercustomizer),并将类交给spring容器管理,另外一种是在spring容器中配置embeddedservletcontainerfactory接口实现类,这里我们主要针对内置tomcat,即tomcatembeddedservletcontainerfactory类

3.1、第一种方式实现embeddedservletcontainercustomizer接口,并交给spring容器管理

@component
public class myembeddedservletcontainercustomizer implements embeddedservletcontainercustomizer {
  @override
  public void customize(configurableembeddedservletcontainer container) {
    //org.springframework.boot.context.embedded.tomcat.tomcatembeddedservletcontainerfactory 
    //说明默认是的tomcat容器
    system.out.println(container.getclass());
    tomcatembeddedservletcontainerfactory factory = (tomcatembeddedservletcontainerfactory) container;
    //设置端口
    factory.setport(8088);
    //设置tomcat的根目录
    factory.setbasedirectory(new file("d:/tmp/tomcat"));
    //设置访问日志存放目录
    factory.addcontextvalves(getlogaccesslogvalue());
    //设置tomcat线程数和连接数
    factory.addconnectorcustomizers(new mytomcatconnectorcustomizer());
    //初始化servletcontext对象
    factory.addinitializers((servletcontext) -> {
      system.out.println(" = = = = 获取服务器信息 = = " + servletcontext.getserverinfo());
    });
  }
  private accesslogvalve getlogaccesslogvalue() {
    accesslogvalve accesslogvalve = new accesslogvalve();
    accesslogvalve.setdirectory("d:/tmp/tomcat/logs");
    accesslogvalve.setenabled(true);
    accesslogvalve.setpattern(constants.accesslog.common_pattern);
    accesslogvalve.setprefix("springboot-access-log");
    accesslogvalve.setsuffix(".txt");
    return accesslogvalve;
  }
}
/**
 * 定制tomcat的连接数与线程数
 */
class mytomcatconnectorcustomizer implements tomcatconnectorcustomizer {
  @override
  public void customize(connector connector) {
    //连接协议 http/1.1
    system.out.println(connector.getprotocol());
    //连接协议处理器 org.apache.coyote.http11.http11nioprotocol
    system.out.println(connector.getprotocolhandler().getclass());
    //http11nioprotocol
    http11nioprotocol protocolhandler = (http11nioprotocol) connector.getprotocolhandler();
    // 设置最大连接数
    protocolhandler.setmaxconnections(2000);
    // 设置最大线程数
    protocolhandler.setmaxthreads(500);
  }
}

3.1、在spring容器中配置embeddedservletcontainerfactory实现类

@springbootconfiguration
public class webserverconfiguration {
  @bean
  public embeddedservletcontainerfactory embeddedservletcontainerfactory() {
    tomcatembeddedservletcontainerfactory factory = new tomcatembeddedservletcontainerfactory();
    //设置端口
    factory.setport(8089);
    //设置404错误界面
    factory.adderrorpages(new errorpage(httpstatus.not_found, "/404.html"));
    //设置在容器初始化的时候触发
    factory.addinitializers((servletcontext) -> {
      system.out.println(" = = = = 获取服务器信息 = = " + servletcontext.getserverinfo());
    });
    //设置最大连接数和最大线程数
    factory.addconnectorcustomizers((connector) -> {
      http11nioprotocol protocolhandler = (http11nioprotocol) connector.getprotocolhandler();
      protocolhandler.setmaxconnections(2000);
      protocolhandler.setmaxthreads(500);
    });
    //设置访问日志记录文件的目录
    factory.addcontextvalves(getlogaccesslogvalue());
    return factory;
  }
  private accesslogvalve getlogaccesslogvalue() {
    accesslogvalve accesslogvalve = new accesslogvalve();
    accesslogvalve.setdirectory("d:/tmp/logs");
    accesslogvalve.setenabled(true);
    accesslogvalve.setpattern(constants.accesslog.common_pattern);
    accesslogvalve.setprefix("springboot-access-log");
    accesslogvalve.setsuffix(".txt");
    return accesslogvalve;
  }
}

4、总结

以上所述是小编给大家介绍的spring boot 定制与优化内置的tomcat容器实例详解,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网