接上篇http://www.iteye.com/topic/994833,
我们看到JioEndPoint的start方法有下面一段代码:
// Create worker collection
if (executor == null) {
workers = new WorkerStack(maxThreads);
}
在上一篇中,executor一直都为null。什么时候不为空呢,这里因为Server.xml文件里的Connector元素还有一个executor属性,它指向一个Executor属性的名字。(参考:
http://tomcat.apache.org/tomcat-6.0-doc/config/http.html)。
在连接器配置项的上方有一个默认的Executor元素:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
不过当前他是注释掉的,我们把他打开。
这个Executor默认的类是org.apache.catalina.core. StandardThreadExecutor,
当然你可以通过它的className属性使用自己的类,但必须像StandardThreadExecutor
一样实现Executor接口。
StandardThreadExecutor是在Doug lea大爷的ThreadPoolExecutor类构造出来的:
public void start() throws LifecycleException {
lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
TaskQueue taskqueue = new TaskQueue();
TaskThreadFactory tf = new TaskThreadFactory(namePrefix);
lifecycle.fireLifecycleEvent(START_EVENT, null);
executor = new ThreadPoolExecutor(getMinSpareThreads(), getMaxThreads(), maxIdleTime, TimeUnit.MILLISECONDS,taskqueue, tf) {
@Override
protected void afterExecute(Runnable r, Throwable t) {
AtomicInteger atomic = submittedTasksCount;
if(atomic!=null) {
atomic.decrementAndGet();
}
}
};
taskqueue.setParent( (ThreadPoolExecutor) executor);
submittedTasksCount = new AtomicInteger();
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
}
剩下的工作就是在Connector里添加属性executor,来引用tomcatThreadPool。
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
这样executor就横空出世。
那么开始那段代码就不需要WorkerStack了。Tomcat虽然自个搞了个WorkerStack出来,
但还是给Doug lea大爷一个面子哦。
这样processSocket不需大费周折,直接交给executor去执行就OK了:
protected boolean processSocket(Socket socket) {
try {
if (executor == null) {
getWorkerThread().assign(socket);
} else {
executor.execute(new SocketProcessor(socket));
}
} catch (Throwable t) {
// This means we got an OOM or similar creating a thread, or that
// the pool and its queue are full
log.error(sm.getString("endpoint.process.fail"), t);
return false;
}
return true;
}
分享到:
相关推荐
《Tomcat6源码分析——深入理解Web服务器的运行机制》 Tomcat6作为Apache软件基金会的Jakarta项目的一部分,是一款广泛使用的Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,为开发和部署...
7. **连接器(Connector)**:Tomcat支持多种协议,如HTTP/1.1、AJP等。`Coyote`组件负责处理这些协议,其中` CoyoteConnector`是核心部分。 8. **JSP和 Jasper**:Tomcat内置了JSP引擎Jasper,负责编译JSP页面为...
4. **源码分析**: - 源码可以帮助开发者深入理解Tomcat的工作原理,比如请求处理流程、会话管理、错误处理等。 - 关注`org.apache.catalina`和`org.apache.coyote`包下的类,了解请求和响应的生命周期。 - 学习`...
Tomcat作为轻量级应用服务器,它的源码分析对于学习和理解HTTP服务、Servlet容器、JSP编译和执行流程、线程管理、连接池以及安全管理等方面的知识具有极高的价值。 在Tomcat6的源码中,我们可以关注以下几个关键点...
Apache Tomcat 8.5.23 源码分析 Apache Tomcat 是一个开源的、免费的Web服务器和Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,是开发和部署Java Web应用的重要平台。深入理解Tomcat的源码有助...
源码分析是提升开发者对服务器内部运作机制理解的重要途径,尤其对于Tomcat这样的核心组件,源码的学习能够帮助我们更深入地理解Web应用的部署、运行以及性能优化。 首先,我们要了解Tomcat的架构。Tomcat7基于...
深入Tomcat的源码可以帮助我们理解其内部工作原理,包括请求处理流程、线程模型、连接器和容器的概念,以及部署和热部署机制。学习Tomcat源码可以提高我们的服务器优化能力,比如通过调整配置参数来提升性能。 接...
2. **Coyote**:Coyote是Tomcat的连接器组件,负责处理网络I/O。它实现了不同的协议如HTTP/1.1,负责接收和响应客户端请求。 3. **Apr**(Apache Portable Runtime):这是一套跨平台的库,用于提高Tomcat的性能,...
Apache Tomcat源码分析 Apache Tomcat是一款广泛应用的开源Java Servlet容器,它是Java EE Web应用程序的标准实现。Tomcat源码的深入理解对于Java Web开发者来说是至关重要的,它可以帮助我们了解HTTP服务器的工作...
对于想要了解Tomcat内部工作原理、优化服务器性能或者进行自定义扩展的开发者来说,这样的源码分析是极具价值的。 【标签】"Tomcat"进一步强调了主题的焦点,Tomcat是Java Web开发中不可或缺的一部分,它是Java ...
【TOMCAT源码分析(启动框架)】 Tomcat是一款广泛应用的开源Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,为Web应用程序提供了运行环境。本篇文章将深入探讨Tomcat的系统框架及其启动流程...
【标题】"Tomcat源码分析" 在深入探讨Tomcat源码之前,首先需要了解Tomcat是什么。Tomcat是一款开源的、基于Java的Web应用服务器,由Apache软件基金会开发。它实现了Java Servlet和JavaServer Pages(JSP)规范,...
源码分析的起点通常是主配置文件`conf/server.xml`,它定义了服务器的全局配置,包括端口设置、连接器配置、虚拟主机等。在Tomcat 6和7中,这些配置的结构和参数都有所不同,反映出版本之间的演进。 接着,Tomcat的...
在源码分析中,开发者可以深入了解Tomcat如何处理请求、响应,以及它如何管理Web应用程序的生命周期。此外,对于性能优化、自定义行为或解决特定问题,源码阅读也是非常有价值的。 7.0.59和7.0.69之间的差异可能...
源码分析: 1. **目录结构**:解压后的源码文件夹通常包含`bin`、`conf`、`lib`、`logs`、`webapps`、`work`等目录。`bin`存放启动和停止服务器的脚本,`conf`存储配置文件,`lib`包含运行Tomcat所需的JAR文件,`...
4. **连接器与协议处理**:Coyote作为Tomcat的连接器,负责监听端口,接收并解析HTTP请求。它支持多种协议处理器,如AJP(Apache JServ Protocol)和HTTP/1.1,这些处理器负责与客户端进行数据交换。 5. **线程池...
总结,Tomcat 6.0源码分析是一个深入了解Java Web服务器运行机制的过程,这不仅有助于我们理解Web服务器的工作原理,还能帮助我们优化应用性能、排查问题,甚至为开发自定义服务器提供基础。通过深入研究`apache-...
Tomcat源码分析有助于识别性能瓶颈,例如调整线程池大小、缓存策略、连接器设置等。此外,了解如何配置和使用NIO或APR(Apache Portable Runtime)连接器可以显著提升Tomcat的并发处理能力。 8. **故障排查** ...
6. **连接器与管道**:Coyote连接器负责接收和发送网络数据,管道(Pipeline)则提供了灵活的处理链,允许自定义处理器(Valve)来扩展Tomcat的功能。 7. **部署与热部署**:Tomcat支持自动部署和热部署,只需将WAR...