Spring Boot 定制与优化内置的Tomcat容器
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.2、在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、总结
本文主要记录对内置容器优化和定制的方式,用于自己加深对SpringBoot理解。
文章来源:https://my.oschina.net/serve/blog/1581862
Spring Boot 定制与优化内置的Tomcat容器的更多相关文章
- 015-Spring Boot 定制和优化内嵌的Tomcat
一.内嵌web容器 参看http://www.cnblogs.com/bjlhx/p/8372584.html 查看源码可知提供以下三种: 二.定制优化tomcat 2.1.配置文件配置 通过appl ...
- 从零开始的Spring Boot(6、Thymeleaf内置对象及表达式大全)
1.1 基础对象 #ctx:上下文对象 ${#ctx.locale} ${#ctx.variableNames} ${#ctx.request} ${#ctx.response} ${#ctx.ses ...
- Spring 事件(1)- 内置事件
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
- 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 我的Spring Boot学习记录(二):Tomcat Server以及Spring MVC的上下文问题
Spring Boot版本: 2.0.0.RELEASE 这里需要引入依赖 spring-boot-starter-web 这里有可能有个人的误解,请抱着怀疑态度看. 建议: 感觉自己也会被绕晕,所以 ...
- SpringBoot怎么自动部署到内置的Tomcat的?
先看看SpringBoot的主配置类的main方法: main方法运行了一个run()方法,进去run方法看一下: /** * 静态帮助程序,可用于从中运行{@link SpringApplicati ...
- ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)
在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...
- spring boot定制Jackson ObjectMapper,为什么不生效
先说结论: 项目中定制了spring 的redisTemplate,而这个template没有使用我自定义的Jackson ObjectMapper.所以不生效. 下面是详细过程: 起因是spring ...
- Spring Boot 定制URL匹配规则的方法
事情的起源:有人问我,说编写了一个/hello访问路径,但是吧,不管是输入/hello还是/hello.html,还是/hello.xxx都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后 ...
随机推荐
- Android SimpleAdapter
1.MainActivity.java public class MainActivity extends Activity { private ListView listView; private ...
- 常用加密算法的Java实现总结(二)
常用加密算法的Java实现总结(二) ——对称加密算法DES.3DES和AES 摘自:http://www.blogjava.net/amigoxie/archive/2014/07/06/41550 ...
- 软件——机器学习与Python,输入输出的用法
转自:http://www.cnblogs.com/graceting/p/3875438.html 输入很简单 x = input("Please input x:") Plea ...
- LED恒流设计
- 【】minimum
[链接]h在这里写链接 [题意] 给两个数字a,b,每次操作可以把a+1a+1,或把a∗k 问至少多少次操作可以使得a=b. 1<=a,b<=10^18,0 <= k <= 1 ...
- 程序员的困境 - R中国用户组-炼数成金
原文:http://www.oschina.net/news/43389/the-plight-of-programmer 在大型公司中不能腐蚀自己的学习能力和时间能力. 最近我为一个内核程序员的职位 ...
- eclipse config 2 tab -> space
编码规范要求不同意使用tab,可是又要有4个字符的缩进,连点4次space,这不是程序猿的风格 来看看 eclipse 设置一次tab像space的转换 例如以下操作 Window->Prefe ...
- 链表(三)——链表删除冗余结点&插入结点到有序链表
1.一个以递增方式排列的链表,去掉链表中的冗余值. 思路一:设有两个指针p和q.使p不动,q依次往后循环直到p->data不等于q->data,再将中间的冗余数据删除. 思路二:设有两个指 ...
- 【26.83%】【Codeforces Round #380C】Road to Cinema
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- android获取一个用于打开Word文件的intent
近期在做项目使用webview显示后,有写文档须要打开,找了一些资料,研究了一下,弄出来了! 以下贴一下主要代码: param为文档的主要路径 public static Intent getWord ...