- 浏览: 262656 次
- 性别:
- 来自: 南京
-
最新评论
-
guosunpeng:
顶顶顶顶顶
使用HttpClient做请求响应中转 -
Tyrion:
ZHENFENGSHISAN 写道赞
消息队列之 RabbitMQ -
hbxflihua:
老弟,你这个问题应该是pring AOP代理不支持类内部方法调 ...
spring事务异常回滚使用注意点 -
ZHENFENGSHISAN:
赞
消息队列之 RabbitMQ -
Tyrion:
PS:这里的博客已经不更新了,新博客在简书:http://ww ...
Tomcat7中web应用加载原理(二)web.xml解析
文章列表
前一篇文章讲了org.apache.catalina.startup.HostConfig的lifecycleEvent方法中所做的事情。最后看到在Tomcat启动时或启动后(后台线程定时扫描)会调用HostConfig类的deployApps方法:
/**
* Deploy applications for any directories or WAR files that are ...
为什么关心Tomcat中一个web应用的加载过程?在前面的文章中看过多次Tomcat的组件结构图,这里再贴出来回顾一下:
之前的《Tomcat7启动分析》系列文章中看到Tomcat启动的时候将会解析server.xml,根据里面所配置的各个节点信息逐 ...
通过前面的三篇文章看到了一次客户端连接在Tomcat内部被转换成了请求对象(org.apache.catalina.connector.Request类的实例),并在该请求对象内部将与本次请求相关的Host、Context、Wrapper对象的引用。本文主要分析该请求对象在容器内部流转的经过。
再来看一下Tomcat7内部的组件结构图:
其实这张图已经给出了答案,在Connector接收到一次连接并转化成请求(Request)后,会将请求传递到Engine的管道(Pipeline)的阀(ValveA)中。请求在Engine的管道中最终会传递到Engine Valve这个阀中。接着请求会从 ...
前一篇文章分析到了org.apache.coyote.http11.AbstractHttp11Processor类process方法,以解析请求头的getInputBuffer().parseRequestLine方法调用为例,看到如何从Socket的IO流中取出字节流数据,根据Http协议将字节流组装到Tomcat内部的org.apache.coyote.Request对象的相关属性中。
本文和下一篇文章将会解释构造好的Tomcat的内部请求对象从Connector到Engine到Host到Context最后到Servlet的过程。
回到org.apache.coyote ...
先抛开之前所看到的Tomcat源码不谈,Tomcat作为一个用Java实现的Web服务器,如果让你来实现,那么从何入手?
这里首先需要厘清的是Web服务器的概念,谷歌了一下,发现这条解释还算靠谱点,【在网络环境下可以向发出请求的浏览器提供文档的程序】。这里面重点有两条,1.网络环境下,2.能够给出响应。用Java写过网络通信程序的都知道,这里必然会用到Socket编程。我们自己要实现的服务器程序作为Socket编程里的服务端,浏览器作为Socket编程里的客户端。
要理解Tomcat原理,Socket编程这块的基本原理必须得了解,google一把一大堆,这里不再单独做介绍。下面给出一个服 ...
在默认的配置下Tomcat启动好之后会看到后台上总共有6个线程在运行。其中1个用户线程,剩下5个为守护线程(如下图所示)。
如果你对用户线程、守护线程等概念不熟悉,请参看前一篇文章——Tomcat7服务器关闭原理。
这里重点关注以http-bio-8080开头的两个守护线程(即http-bio-8080-Acceptor-0和http-bio-8080-AsyncTimeout),因为这是我们在Tomcat的默认配置下发布web应用时实际处理请求的线程。先看下这两个线程在容器启动时是如何产生和启动的。
在前面将Tomcat启动的系列文章中看到Tomcat容器启动时会用Digester读 ...
之前的几篇文章讲了Tomcat的启动过程,在默认的配置下启动完之后会看到后台实际上总共有6个线程在运行。即1个用户线程,剩下5个为守护线程(下图中的Daemon Thread)。
如果你对什么叫守护线程的概念比较陌生,这里再重复一下 ...
也谈Spring,为何用它?
- 博客分类:
- Java
一个老生常谈的话题,最近出去面试,十之八九还会问这个,今天在博客园里有人说Spring的问题,忍不住点进去看了看,感觉没说出个所以然,所以写篇小文谈谈我的看法。
Spring的由来在其作者Rod Johnson的两本名著(《Expert One-on-One J2EE Development without EJB》和《Expert One-on-One J2EE Design and Development》)中讲得清清楚楚,这里所说的大部分是在拾人牙慧,没办法,多年前的东西现在还是需要重复。
从历史上看,Spring是在对当时横行Java世界的企业级应用的标准解决方案EJB的反 ...
在上篇文章分析Tomcat7的各组件的init、start方法时经常会看到有一个setStateInternal方法的调用,在查看LifecycleBase类及其它各组件的源码时会在多处看到这个方法的调用,这篇文章就来说说这方法,以及与这个方法相关的Tomcat的Lifecycle机制和实现原理。
上篇文章里谈到Tomcat7的各组件的父类LifecycleBase类,该类实现了接口org.apache.catalina.Lifecycle,下面是这个接口里定义的常量和方法:
细心的读者会发现,上篇文章里提到的init和start方法实际上是在这个接口里面定义好的,也正因为有各组件 ...
在正常启动Tomcat7的情况下,上篇文章分析到了执行org.apache.catalina.core.StandardServer的init和start方法这儿,那么就来看看这两个方法里面到底干了些什么。
但是在StandardServer类里面并没有发现这两个方法:
由此推知这两方法必定是在该类的父类中已实现了,在StandardServer类的父类LifecycleMBeanBase类的父类LifecycleBase类里面终于找到了这两个方法的实现,下面先来看下init方法:
@Override
public final synchronized void in ...
前一篇文章里最后看到Bootstrap的main方法最后会调用org.apache.catalina.startup.Catalina对象的load和start两个方法,那么就来看看这两个方法里面到底做了些什么。
load方法:
/**
* Start a new server instance.
*/
public void load() {
long t1 = System.nanoTime();
initDirs();
// Before digester - it m ...
之前分析了Tomcat的启动脚本,如果从startup.bat开始启动Tomcat的话会发现最后会调用org.apache.catalina.startup.Bootstrap里的main方法,并且传过来的最后一个命令行参数是start,接下来的启动代码分析就从这里开始。
先看下这个main方法的代码:
/**
* Main method and entry point when starting Tomcat via the provided
* scripts.
*
* @param args Command line argum ...
在之前的环境搭建那篇文章里是通过直接运行BootStarp的main函数来启动的,只是加了一个catalina.home的系统属性。而正常情况下启动Tomcat是通过运行脚本的方式,这个就涉及到建立工程时拷贝过来的script目录下的一堆脚本文件了。
以我的windows系统举例,实际上最终是执行startup.bat这个批处理文件来启动tomcat的。
那么启动分析就冲这个文件开始吧:
一、分析startup.bat文件
@echo off
rem Licensed to the Apache Software Foundation (ASF) under one or ...
Tomcat是个很大的项目,写个程序统计了一下java目录下的源文件1262个,总代码行数356163,要把这么多文件逐个研究一番确实需要很大的勇气。我的思路是挑选一些自己以前工作中会接触到的和个人比较感兴趣的点来研究,这样梳理起来算有点头绪,初步给自己的任务列出的是以下几点:
1.容器启动,从server到listener、jndi、service到connetor、engine到host到context到wrapper一系列对象的组装,包括Digester的使用、JMX注册、JDK5中的新的线程池启动方式等。
2.一个socket连接如何转化成request的。
3.一条请求 ...
以前看过Tomcat5的一部分源代码,当时只看了个大概的启动分析,后来看了《How Tomcat Works》这本书,讲的还行,出版的较早,所以是基于Tomcat4的代码的分析,Tomcat已经release到7了,很多后来添加的特性与新的实现方式那本书里面 ...