how tomcat works 总结 三
第七章 日志记录器
第 7 章包括日志,该组件是用来记录错误信息和其他信息的。
这一章比较简单,类图如下:
根据名字我想大家都能猜出来三个实现类都是做什么的,一个按常规输出到控制台,一个按错误模式输出到控制点,一个输出到文件。
Logger类中有一个参数,verbosity,用来表示日志等级,默认为ERROR。
public static final int FATAL = Integer.MIN_VALUE;
在输出日志的时候,只有给定的message的verbosity小于默认的才会输出。
在Bootstrap启动类设置FileLogger
Bootstrap.java System.setProperty("catalina.base", System.getProperty("user.dir")); FileLogger logger = new FileLogger(); logger.setPrefix("FileLog_"); logger.setSuffix(".txt"); logger.setTimestamp(true); logger.setDirectory("webroot"); context.setLogger(logger); 在使用的时候,调用log(message)即可 private void log(String message) { Logger logger = connector.getContainer().getLogger(); if (logger != null) logger.log(threadName + " " + message); }
第八章 载入器
第 8 章解释了加载器(loader)。加载器是一个重要的 Catalina 模块,负责加载 servlet 和一个 web 应用所需的其他类。这章还展示了如何实现应用的重新加载。
类图如下:
为了自定义载入器是为了以下三个目标:
1在载入类中指定某些规则;
2缓存已经载入的类;
3实现类的预载入;
一个一个说:
第一条,在载入类中指定某些规则
我们设定了两个数组变量,triggers与packageTriggers,这个两个数组里面放置不能访问的类与包。当我们加载一个类的时候提前检查类名,包名。这里有一个问题,我们加载类的顺序是:
所有加载过的类都要进行缓存,所以首先需要检查本地缓存。
· 如果无法再本地缓存找到类,使用 java.langClassLoader 类的 findLoaderClass 方法在缓存查找类、
· 如果在两个缓存中都无法找到该类,使用系统的类加载器避免从 J2EE 类中覆盖来的 web 应用程序。
· 如果使用了安全管理器,检查该类是否允许加载,如果该类不允许加载,则抛出 ClassNotFoundException 异常。
· 如果要加载的类使用了委派标志或者该类属于 trigger 包中,使用父加载器来加载类,如果父加载器为 null,使用系统加载器加载。
· 从当前的源中加载类
· 如果在当前的源中找不到该类并且没有使用委派标志,使用父类加载器。如果父类加载器为 null,使用系统加载器
· 如果该类仍然找不到,抛出 ClassNotFoundException 异常
就像前面几章
http://localhost:8080/Primitive
请求的PrimitiveServlet不会被第二步的类加载器加载。为什么?请看看类加载器的加载路径范围。
第二条 缓存已经裁人的类
还是说上面的那个类,它会通过
clazz = findClass(name);来加载,如果加载成功class会存储到resouEntries里,如果失败就存储到notFoundResources中。
第三条 实现类的预载入
这条看的不是很懂,DirContext也看的不是很明白。
关于动态载入:
WebLoader.java run方法(部分) while (!threadDone) { // Wait for our check interval threadSleep(); if (!started) break; try { if (!classLoader.modified()) continue; } catch (Exception e) { continue; } // Handle a need for reloading notifyContext(); break; }
modified方法会检查已经载入的类是否被修改,是否修改的表示就是最后修改的时间是否改变!
若有类被修改,调用notifyContext,在notifyContext中会新建一个线程来调用container的reload方法()?为什么要新启一个线程还用说么?
reload方法()会首先关掉子容器,loader等等,然后在重新开启#
how tomcat works 总结 三的更多相关文章
- How Tomcat Works(三)
上文中描述的简单的服务器是不符合Servlet规范的,所以本文进一步描述一个简单的Servlet容器是怎么实现的 所以我们首先要明白Servlet接口规范,规范有不同版本,本人就先一视同仁了: pub ...
- 攻城狮在路上(肆)How tomcat works(三) 连接器:Connector
在介绍中提到,Catalina中有两个主要的模块:连接器和容器.本章中你将会写一个可以创建更好的请求和响应对象的连接器,用来改进第2章中的程序.一个符合Servlet 2.3和2.4规范的连接器必须 ...
- How Tomcat Works(十一)
本文接下来分析tomcat的类载入器,tomcat需要实现一个自定义的载入器,而不能使用系统类载入器 (1)限制serlvet访问当前运行的java虚拟机中环境变量CLASSPATH指明的路径下的所有 ...
- How Tomcat Works(十)
本文接下来分析tomcat的日志记录器,日志记录器是用来记录消息的组件,在tomcat中,日志记录器需要与某个servlet容器相关连:在org.apache.catalina.logger包下,to ...
- How Tomcat Works(九)
本文接下来描述servlet容器是怎样管理其相关组件的生命周期的,首先本人描述一下事件监听模式,也可以称为观察者模式,该模式分为以下角色 即抽象主题角色 具体主题角色 抽象观察者角色及具体观察者角色, ...
- how tomcat works 读书笔记四 tomcat的默认连接器
事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...
- how tomcat works 总结
希望各位网友在看完<<how tomcat works>>一书或者鄙人的tomcat专栏文章后再看这篇博客 这里主要是梳理各个章节的核心概念 第一章 一个简单的Web服务器 第 ...
- How Tomcat Works(二十)
要使用一个web应用程序,必须要将表示该应用程序的Context实例部署到一个host实例中.在tomcat中,context实例可以用war文件的形式来部署,也可以将整个web应用拷贝到Tomcat ...
- How Tomcat Works(十九)
本文重点关注启动tomcat时会用到的两个类,分别为Catalina类和Bootstrap类,它们都位于org.apachae.catalina.startup包下:Catalina类用于启动或关闭S ...
随机推荐
- JDK的安装以及配置
JDK的安装以及配置 JDK(Java Development Kit),顾名思义,是 Java 语言的软件开发工具包(SDK). Android发开使用Java语言,所以装JDK是Android开发 ...
- 15 ActionBar.Tab 以及保存fragment对象 代码案例
API 21弃用 values 中 string文件源码: <?xml version="1.0" encoding="utf-8"?> <r ...
- Android初级教程初谈自定义view自定义属性
有些时候,自己要在布局文件中重复书写大量的代码来定义一个布局.这是最基本的使用,当然要掌握:但是有些场景都去对应的布局里面写对应的属性,就显得很无力.会发现,系统自带的控件无法满足我们的要求,这个时候 ...
- 创建银行API
DECLARE lc_output VARCHAR2(3000); lc_msg_dummy VARCHAR2(3000); lc_return_status VARCHAR2(3000); lc_m ...
- ROS_Kinetic_25 在ubuntu16.04使用Leap_motion并作为手势输入控制Gazebo中的机器人
ROS_Kinetic_25 在ubuntu16.04使用Leap_motion并作为手势输入控制Gazebo中的机器人 先附上资料网址: 1. https://developer.leapmoti ...
- python进行md5加密
代码函数 import hashlib def md5(str): m = hashlib.md5() m.update(str) return m.hexdigest() f = open('idf ...
- 最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)
===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...
- SpringMVC返回json是设置编辑等消息头,消息头信息介绍(respone.setHeader,这个从网上获取)
1. SpringMVC中设置消息头,例子如下: ? 因为上面的代码没有添加该文件的编码说明 , WEB应用程序在将jsp翻译成class文件时 , 把该字符串的内容按默认的保存方式指定的编码ASC ...
- JAVA内部类_1
使用内部类的原因: (1)可以访问该类定义所在作用域中的数据,包括私有数据. (2)可以对同一个包中的其它类隐藏起来. (3)当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷. 下面 ...
- iOS高效编程秘诀—坚持编程习惯
资料源于网络 习惯会影响一个人做事的方式,也会直接影响效率.我经常在项目完成后自我总结,有哪些做得好的,有哪些做得不好的?然后把一些好的流程记录下来,并且重新运用回编程中.那些能够坚持去做的流程,就变 ...