- 浏览: 50241 次
- 性别:
- 来自: 成都
最新评论
-
2022228:
写得很好
学习了
Tomcat启动部分源代码分析(一) -- 概览
文章列表
请求在Tomcat中传到了CoyoteAdapter的#service()方法中后,就要准备进入Pipeline了,如#service()方法中的这句所示: connector.getContainer().getPipeline().getFirst().invoke(request, response); 这里的Container是Engine,然后得到它的Pipeline对象,然后得到他的第一个Valve,如果没有配置的话第一个Valve就是Basic的了,这里就是org.apache.catalina.core.StandardEngineValve,最后调用了它的#invoke()方法 ...
- 2009-05-07 11:34
- 浏览 1433
- 评论(0)
1. Request和Response 当处理请求的时候,Tomcat使用org.apache.coyote.Request和org.apache.coyote.Response对象来封装对Socket的数据处理,就好像它们是输入流和输出流一样。 Request和Response是low-level的,并不是用于在开发中使用的,所以,Tomcat使用了适配器模式定义了两个类org.apache.catalina.connector.Request和org.apache.catalina.connector.Response来对前面的low-level对象进行封装,并且扩展了HttpServlet ...
- 2009-05-07 11:33
- 浏览 1283
- 评论(0)
在上一篇文章文章中,Tomcat的请求处理到了JIoEndpoint$Worker#run()方法的handler.process(socket)这个调用中。 这个handler在JIoEndpoint中是这样定义的:
protected Handler handler = null;
这个Handler是在JIoEndpoint内部定义的一个接口,它的内部只有public boolean process(Socket socket);这一个方法。 那么这个handler到底在哪里实现的呢? 这个还要从org.apache.coyote.http11.Http11Protocol#init( ...
- 2009-05-07 11:32
- 浏览 1323
- 评论(0)
书接上文。 当Tomcat的Acceptor监听到有请求到来时,就会结束阻塞,继续进行程序下面的动作。如下面的代码所示:
public void run() {
while (running) {
while (paused) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
try {
// 开始监听端口
Socket socket = serverSocketFactory.accep ...
- 2009-05-07 11:30
- 浏览 990
- 评论(0)
其实tomcat在哪个类中监听请求的代码很容易找到: 在org.apache.tomcat.util.net.JIoEndpoint$Acceptor#run()中的这么一句: Socket socket = serverSocketFactory.acceptSocket(serverSocket); 可是ServerSocketFactory是个抽象类,我还是很想知道整个过程的来龙去脉的。 那就要还是从初始化开始,当Tomcat的HTTP Connector初始化,会org.apache.coyote.http11.Http11Protocol调用它的init()方法。 在这个init()方 ...
- 2009-05-07 11:29
- 浏览 1400
- 评论(0)
前面所叙述的tomcat启动中并没有webapps下边应用程序载入的内容,今天花了些时间在源代码中找到了一些相关的内容。 1. webapps下的应用程序的载入,要从Digester的HostRuleSet说起了:
public void addRuleInstances(Digester digester) {
diges ...
- 2009-05-07 11:28
- 浏览 1199
- 评论(0)
四. 开启容器 最后是Bootstrap#start()方法的内容了,start()方法结束后,Tomcat就启动成功了。 下面来看一下Bootstrap#start()的内容:
public void start() throws Exception {
if (catalinaDaemon == null)
init();
// 调用Catalina#start()
Method method = catalinaDaemon.getClass().getMethod("start", (Class[]) null);
met ...
- 2009-05-07 11:27
- 浏览 1204
- 评论(0)
二. 载入 2. Bootstrap的#Bootstrap#load(String[] arguments)方法。 方法的源代码如下述所示:
private void load(String[] arguments) throws Exception {
// 要调用的方法名
String methodName = "load";
// 参数名
Object param[];
// 参数值
Class paramTypes[];
if (arguments == null || arguments.length == 0) {
...
- 2009-05-07 11:23
- 浏览 1194
- 评论(0)
二. 初始化 1. 首先是Bootstrap的#init()操作。
public void init() throws Exception {
// 设定Catalina
setCatalinaHome();
setCatalinaBase();
// 初始化ClassLoader
initClassLoaders();
// 设置线程的上下文的ClassLoader
Thread.currentThread().setContextClassLoader(catalinaLoader);
SecurityClas ...
- 2009-05-07 11:20
- 浏览 1097
- 评论(0)
一. 概览 本文所涉及的Tomcat为6.0版本。 Tomcat的启动始于org.apache.catalina.startup.Bootstrap#main(),下面来列举一下相关的源代码:
public static void main(String args[]) {
if (daemon == null) {
daemon = new Bootstrap();
try {
/* 初始化 */
daemon.init();
} catch (Throwable t) {
t.printStackTrace();
...
- 2009-05-07 11:17
- 浏览 1432
- 评论(1)
Tomcat会开启一个后台线程每隔一段时间检查Session的有效性,这个线程是在Tomcat启动的时候当StardardEngine启动时随之启动的。可以参看StardardEngine的基类ContainerBase的#threadStart()方法:
protected void threadStart() {
if (thread != null)
return;
if (backgroundProcessorDelay <= 0)
return;
threadDone = false;
String threadName = ...
- 2009-05-07 10:10
- 浏览 971
- 评论(0)
Session对象的创建一般是源于这样的一条语句: Session session = request.getSession(false);或者Session session = request.getSession();如果不在乎服务器压力可能多那么一点点的话。 在Tomcat的实现中,这个request是org.apache.catalina.connector.Request类的包装类org.apache.catalina.connector.RequestFacade的对象,它的两个#getSession()方法如下:
public HttpSession getSession ...
- 2009-05-07 10:02
- 浏览 1497
- 评论(0)
前面提到的都是与类的泛型化相关的话题,不过方法也可以从泛型中受益,尤其是Helper类的工具方法这种"无状态"的方法更加合适。还是有几个话题可以进一步讨论下的。 1. 类型推导 所谓类型推导,就是编译器可以通过判断参数的类型来推导类型参数(泛型)的类型。这句话初看会发现非常绕口,举个例子就能很好的理解了。
Java代码
public class GenericHelper {
public static <E> Set<E> merge(Set<E> set1, Set<E> set2){
Set ...
- 2009-05-07 09:51
- 浏览 1849
- 评论(0)
记得以前面试的时候曾被问过一个问题:数组和List的区别是什么?当时答的无非就是效率,容量固定,List不能存基本类型等等。当Java发展到了1.5之后,出现了泛型版本的List,又为这个问题的解答加入了一笔。下面就来讲一下与 ...
- 2009-05-07 09:48
- 浏览 1025
- 评论(0)
Java1.5引入了泛型之后,为程序的安全性又增加了一个新的保障,减少了发生运行时类型错误的可能性,这篇文章并不是要讲述泛型的基本操作,而是要了解一些在进行泛型处理时可能会遇到的一些稍微复杂些的问题。在第一篇文 ...
- 2009-05-07 09:45
- 浏览 1223
- 评论(0)