`
yuoveyu
  • 浏览: 27226 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[源码学习]Tomcat6 源码学习

阅读更多
Tomcat6 源码学习
2010-3-29
【tomcat启动类Bootstrap】
t1.tomcat的人口函数,启动类
org.apache.catalina.startup. Bootstrap.java   Main函数

t2.Bootstrap类
初始化 ClassLoader, 然后利用 Java Reflection 调用 Catalina 类来启动 tomcat server

【tomcat扩展-日志】
a1.private static Log log = LogFactory.getLog(Bootstrap.class);
日志可以定义为private 和static

a2.只在本类中使用的方法,使用private,降低访问权限,需要的时候,再考虑重构或者提高访问权限public

a.日志打印前加if(log.isInfoEnabled())
如果代码中含有logger.debug(“string”);此类语句,尽管在log4j.xml配置文件中对该类logger的level为ERROR,但是仍然会产生较大的内存开销,通常是所要输出的string的几十倍甚至上百倍大小,对内存开销非常大。优化方法为:使用logger进行判断。


2010-3-30
【tomcat扩展-classloader】
a3.如果两个类属于同一个包下,但是由不同的classloader加载,那么他们也不能互访default类型方法,属性

a4.classloader:与C或C++编写的程序不同,Java程序并不是一个可执行文件,而是由许多独立的类文件组成,每一个文件基本上对应于一个类。此外,这些类文件并非立即全部都装入内存,而是根据程序需要装入内存。ClassLoader是JVM中将类装入内存的那部分

a5.定制的ClassLoader应用:
1.在执行非置信代码之前,自动验证数字签名
2.使用用户提供的密码透明地解密代码
3.动态地创建符合用户特定需要的定制化构建类
4.任何您认为可以生成Java字节码的内容都可以集成到应用程序中

a6.findClass方法是创建定制的ClassLoader时唯一需要覆盖的方法。
ClassLoader loadClass方法
Class c = findLoadedClass(name);
if (c == null) {
    try {
if (parent != null) {
    c = parent.loadClass(name, false);
} else {
    c = findBootstrapClass0(name);
}
    } catch (ClassNotFoundException e) {
        // If still not found, then invoke findClass in order
        // to find the class.
        c = findClass(name);
    }
}

a7.ClassLoader(CCL)的任务是确保代码被编译和更新。
下面描述了它的工作方式:1、当请求一个类时,先查看它是否在磁盘的当前目录或相应的子目录。
2、如果该类不存在,但源码中有,那么调用Java编译器来生成类文件。
3、如果该类已存在,检查它是否比源码旧。如果是,调用Java编译器来重新生成类文件。
4、如果编译失败,或者由于其它原因不能从现有的源码中生成类文件,返回ClassNotFoundException。
5、如果仍然没有该类,也许它在其它库中,所以调用findSystemClass来寻找该类。
6、如果还是没有,则返回ClassNotFoundException。
7、否则,返回该类。
8、调用findLoadedClass来查看是否存在已装入的类。
9、如果没有,那么采用那种特殊的神奇方式来获取原始字节。
10、如果已有原始字节,调用defineClass将它们转换成Class对象。
11、如果没有原始字节,然后调用findSystemClass查看是否从本地文件系统获取类。
12、如果resolve参数是true,那么调用resolveClass解析Class对象。
13、如果还没有类,返回ClassNotFoundException。
14、否则,将类返回给调用程序。

【tomcat启动类classloader】
t3.tomcat自定义了三个类,catalinaLoader commonLoader,sharedLoader
Common - 载入$CATALINA_HOME/common/...它们对TOMCAT和所有的WEB APP都可见
Catalina - 载入$CATALINA_HOME/server/..它们仅对TOMCAT可见,对所有的WEB APP都不可见
Shared-载入$CATALINA_HOME/shared/它们仅对所有WEB APP可见,对TOMCAT不可见(也不必见)

t4.Bootstrap通过反射初始化Catalina类,
反射调用Catalina方法setParentClassLoader,传递SharedClassloader
反射call Catalina方法load 利用server.xml中的配置初始化Service,Server,Engine,Host
反射call Catalina方法start Start the new server  该server是通过  解析xml文件生成的org.apache.catalina.core.StandardServer类


【tomcat-xml解析】
1.Tomcat取了Digester中的interface和几个Rule,并且自己实现了一些 Rule 来解析xml.
2.tomcat解析xml创建以下几个类
Server:
org.apache.catalina.core.StandardServer
Resources:
org.apache.catalina.deploy.NamingResources
Server's Listener:( 监听server事件)
org.apache.catalina.core.AprLifecycleListener
org.apache.catalina.core.JasperListener
org.apache.catalina.mbeans.ServerLifecycleListener
org.apache.catalina.mbeans.GlobalResourcesLifecycleListener
Service:
org.apache.catalina.core.StandardService
Executor:
org.apache.catalina.core.StandardThreadExecutor
Engine:
org.apache.catalina.core.StandardEngine
Connector:
org.apache.catalina.connector.Connector

【tomcat-流程】
3.StandardServer启动StandardService,StandardService启动Connector,
Connector启动Http11Protocol,Http11Protocol启动JIoEndpoint,
JioEndpoint启动server Socket,listern 8080端口,处理http请求

4.Http11Processor
Processes HTTP requests.
由http11ConnectionHandler调用,Http11ConnectionHandler由JioEndpoint中的Work调用

5.A connector passes the request and reponse objects to the Container by calling the Container interface's invoke method
public void invoke(Request request, Response response)
        throws IOException, ServletException;

inside the invoke method ,the container loads the servlet class,call its sevice method ,manage sessions,etc.

6.Connector 方法initialize中
// Initializa adapter
adapter = new CoyoteAdapter(this);
protocolHandler.setAdapter(adapter);
adapter通过protocolHandler(Http11Protocol)传给Http11Processor,
Http11Processor解析,create request和response,通过adapter传送给Container

7.Tomcat使用Pipeline模式在各层容器间传递请求,将请求通过管道依次通过Engine,Host,Context和Wrapper。另外,每一个容器  
都可以设置一系列的Valve去对请求进行拦 截,就像管道中的阀一样对请求的行为进行一些干涉。


2010-3-31
【tomcat-流程】
1.tomcat的pipeline/valve是标准的责任链模式,每个级别的容器中pipeline所有的valve都完成动作后会将request/response传到下一个容器的pipeline中的valve,
这样一直传递下去直到Wrapper的BaseValve.
Ps:每个容器的BaseValve会调用下个容器的起始valve

2.StandardEngine
属性Pipeline  pipeline = new StandardPipeline(this);
构造函数里会设置最底层的阀门
pipeline.setBasic(new StandardEngineValve());
如果需要设置新阀门处理需求,只需要调用 pipeline.addValve(Valve valve);

3.CoyoteAdapter中会执行
connector.getContainer().getPipeline().getFirst().invoke(request, response);
该行代码会一层一层调用添加的阀门,处理下去.

2010-4-1
【tomcat-流程】
1.jk插件负责tomcat和其它http容器进行通信

2.连接器协议AJP/1.3是tomcat用来与其它http容器进行连接的协议

3.把指定Context的classloader付给当前线程。
Thread.currentThread().setContextClassLoader(context.getLoader().getClassLoader());这样request就只看见指定的context下面的classes和jar包,而看不见tomcat本身的类。

2010-4-7
【tomcat-socke与worker线程】
/**
* Process an incoming TCP/IP connection on the specified socket.  Any
* exception that occurs during processing must be logged and swallowed.
* <b>NOTE</b>:  This method is called from our Connector's thread.  We
* must assign it to our own thread so that multiple simultaneous
* requests can be handled.
* @param socket TCP socket to process
*/
synchronized void assign(Socket socket) {
// Wait for the Processor to get the previous Socket
while (available) {
try {
              wait();
       } catch (InterruptedException e) {
       }
    }
    // Store the newly available Socket and notify our thread
    this.socket = socket;
    available = true;
    notifyAll();
}

/**
* Await a newly assigned Socket from our Connector, or <code>null</code
* if we are supposed to shut down.
*/
private synchronized Socket await() {
// Wait for the Connector to provide a new Socket
while (!available) {
try {
wait();
} catch (InterruptedException e) {
}
}
    // Notify the Connector that we have received this Socket
    Socket socket = this.socket;
    available = false;
    notifyAll();
return (socket);
}
连接器线程调用worker类的assign类,worker类的执行线程run方法会调用await方法获取socket,通过available变量的设置和wait/notify方法来协调彼此的操作。当连接器线程未传输socket,worker类线程就执行wait等待,
当worker类执行线程在处理忙的时候,连接器线程wait。































分享到:
评论

相关推荐

    tomcat6的源码

    这个源码包,"apache-tomcat-6.0.43-src",是Tomcat 6的官方源代码,非常适合开发者进行深入学习和自定义修改。以下是基于这个源码包的一些关键知识点: 1. **Servlet容器**:Tomcat作为Servlet容器,其主要任务是...

    tomcat源码学习之环境搭建

    在深入探讨Tomcat源码学习之前,我们首先要理解Tomcat是什么。Tomcat是一款开源的、免费的Web服务器和Servlet容器,由Apache软件基金会维护。它实现了Java Servlet和JavaServer Pages(JSP)规范,是Java EE应用...

    Tomcat源码学习:一个最简单的“Tomcat”

    【标题】"Tomcat源码学习:一个最简单的‘Tomcat’",这篇博客主要探讨的是如何通过学习Tomcat的源代码来理解这个流行的开源Java Servlet容器的工作原理。Tomcat是Apache软件基金会的一个项目,它是Java Web应用...

    Tomcat6的源码

    Tomcat6是开源项目,其源码开放给所有人学习和研究,这有助于提升开发者对Web应用服务器内部机制的理解。 【描述】"Tomcat6的可运行Java源码代码,注意可以运行的哦,只需导入即可"表明这个源码包不仅包含源代码,...

    tomcat6,7源码

    《深入剖析Tomcat 6与7的源码》 Tomcat作为开源的Java Servlet容器,是许多Web开发者和系统管理员的首选。它以其轻量级、高效和易于配置的特性赢得了广泛赞誉。本文将深入探讨Tomcat 6和7的源码,揭示其内部工作...

    tomcat7源码

    源码分析是提升开发者对服务器内部运作机制理解的重要途径,尤其对于Tomcat这样的核心组件,源码的学习能够帮助我们更深入地理解Web应用的部署、运行以及性能优化。 首先,我们要了解Tomcat的架构。Tomcat7基于...

    tomcat9 源码学习

    源码学习对于理解Tomcat的工作原理、优化性能以及自定义功能至关重要。以下是一些在学习Tomcat9源码时会涉及的关键知识点: 1. **架构概述**:Tomcat由多个组件构成,如Catalina(核心Servlet容器)、 Coyote...

    tomcat8源码

    Apache Tomcat 8.5.23 源码分析 Apache Tomcat 是一个开源的、免费的Web服务器和Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,...因此,对Tomcat源码的学习对于Java Web开发者来说是至关重要的。

    tomcat6源码分析

    总结,Tomcat6源码分析是深入了解Web服务器运行机制的重要途径,通过对源码的学习,我们可以掌握其内部的工作原理,从而在实际开发中实现更高效、更稳定的应用部署和维护。这是一份宝贵的资源,值得我们深入研究和...

    tomcat7源码下载

    《深入剖析Tomcat7源码》 ...通过对Tomcat7源码的深入学习,开发者不仅可以了解其工作原理,还能针对具体需求进行定制化开发,提高应用的稳定性和效率。下载并研究Tomcat7源码,对于提升Java Web开发技能大有裨益。

    Tomcat6源码下载

    首先,源码下载是学习任何软件内部工作原理的第一步。对于Tomcat 6.0,你可以通过Apache官方网站获取官方源码,这对于希望深入了解Web服务器工作方式、定制化部署或进行性能优化的开发者来说至关重要。源码提供了一...

    tomcat源码

    通过阅读和分析Tomcat源码,我们可以学习到以下知识点: 1. **Servlet生命周期**:Tomcat如何加载、初始化、服务、销毁Servlet,以及ServletConfig和ServletContext的角色。 2. **线程池管理**:Tomcat如何使用...

    tomcat6源码

    《深入剖析Tomcat6源码》 ...通过对Tomcat6源码的分析,开发者不仅可以提升对Web服务器内部运作的理解,还能学习到如何优化性能、调试问题以及定制化开发。这将对Java Web开发和系统架构设计有着深远的影响。

    tomcat5 源码学习,深度剖析tomcat一书的指定tomcat版本

    tomcat5 源码学习,深度剖析tomcat一书的指定tomcat版本,随着tomcat版本的升级,内容发生 了变化,但为了读懂书籍,还是得使用老版本得源码,欢迎大家下载,官网下载会出现下载不了的情况,我主页有tomcat4-tomcat9...

    tomcat源码学习

    【标题】"Tomcat源码学习"涉及到的是对Apache Tomcat服务器内部运行机制的深入理解。Tomcat是一款广泛使用的开源Java Servlet容器,它实现了Java EE的Web应用规范,特别是Servlet和JSP。源码学习是提升技术水平、...

    Tomcat深入剖析pdf+源码(Tomcat运行原理)

    总之,《Tomcat深入剖析》结合源码分析,是一本全面且深入的Tomcat学习资源,无论是初学者还是经验丰富的开发者,都能从中受益匪浅。通过学习,读者不仅能够掌握Tomcat的基本操作,还能深入了解其内部机制,为构建...

    tomcat8 源码学习,欢迎大家下载,官网下载会出现下载不了的情况

    【标题】:Tomcat8源码学习 在Java Web开发领域,Tomcat是一个非常重要的应用服务器,它作为开源的...对于想要从事中间件开发或者希望提高Java Web性能优化能力的程序员来说,Tomcat源码学习是一条必不可少的道路。

    Tomcat6 编译好的源码

    8. **国际化和本地化(i18n/l10n)**:Tomcat源码中包含了处理不同语言和区域设置的机制,以支持全球化的Web应用。 9. **错误处理和日志记录**:Tomcat有内置的错误页面和日志记录系统,方便开发者诊断问题。 10. ...

    tomcat6,用于idea适配低版本的tomcat

    "用于idea适配低版本的tomcat"表明这个压缩包提供了在IntelliJ IDEA中配置和使用Tomcat 6的兼容性支持,这对于维护老项目或者学习历史技术栈的开发者来说非常有用。 标签中提到了“intellij-idea”,这再次强调了该...

Global site tag (gtag.js) - Google Analytics