- 浏览: 81992 次
- 性别:
- 来自: 北京
最新评论
-
zhouxinwolf:
我copy你的代码,启动,用jconsole.exe能看到这个 ...
tomcat 7 源码分析-6 server初始化中的JMX(DynamicMBean)续 -
jieyuan_cg:
呃,这个不就是castor做的事情么?
tomcat 7 源码分析-3 使用Digester读取xml文件实例化server
文章列表
举例的情况:
debug level的信息——输出到console
error level的信息——输出到文件中
log4j的配置信息:
参数Threshold,举例Threshold设置成warn,那么低于warn的level,都可以在用这个appender输出。
<appender name="OutInfo" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="W ...
Eclipse用户总是在NetBeans炫耀Eclipse是多么的漂亮,尤其会说NetBeans的字体丑陋,NetBeans的字体太小,编辑器里的字体不好看,字体边楞有锯齿等等。坦白的说,这也是我刚从Eclipse转到NetBeans的第一印象。其实由于NetBeans使用Swing构建界面,这使得它缺省的使用Swing的缺省配置,尤其是中文,就更不敢恭维。其实NetBeans提供了强大的配置工具,完全可以将NetBeans配置的很漂亮。下面我就以Windows上的NetBeans安装为例,说说如何配置字体。
1.NetBeans界面上的普通字体大小,可以通过配置NetBe ...
实现
container←-----containerBase
↑ ↑
|继承 |继承
| |
| 实现 ...
tomcat打开endpoint的监听对通过某种协议,通常下是http的信息进行解析,组装成request,接着给Http11Protocol(ProtocolHandler)和Http11Processor处理。
adapter.service(request, response);
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
最终选择具体的Valve类处理request并生成response。
Valve和Pipeline的关系:Pipeli ...
Enumeration枚举,就是要把内容没有重复的遍历,而且不破坏原有的存储空间。在http headers的实现中,tomcat实现了一些枚举类。
Enumerate the distinct header names. Each nextElement() is O(n)
class NamesEnumerator implements Enumeration<String> {
...
Implementation of InputBuffer which provides HTTP request header parsing as well as transfer decoding
socket能获得客户端发来的http协议,tomcat需要对http协议(传输的是byte流)进行解析,例如获得http的method,protocol,URI等信息.
既然是对byte流进行处理,tomcat封装了InternalInputBuffer。
public class InternalInputBuffer extends AbstractInputBuffer
...
tomcat开启socket的accept线程后,其实要做的主要工作是交给worker线程去完成的,这其中使用了线程池的技术。
如:
try {
SocketWrapper<Socket> wrapper = new SocketWrapper<Socket>(socket);
wrapper.setKeepAliveLeft(getMaxKeepAliveRequests());
getExecutor().execute(new SocketProcessor(wrapper));
...
tomcat中ServerSocket线程监听是否有socket连接,如果有就转而处理。这个过程类似于你向tomcat发送一个URL请求,实质这个请求转换成http协议,通过socket发出来。
先看ServerSocket的封装主要为
public abstract class ServerSocketFactory implements Cloneable
class DefaultServerSocketFactory extends ServerSocketFactory {
DefaultServerSocketFactory () {
/* ...
多态带来的方法调用顺序
(1) 方法调用优先级由高到低:
this.method(O)--->super.method(O)---->
thismethod((super)0)----->super.method((super)0)
(2)SupeerClass sub = new SubClass():情况的讨论
1) 对象sub向外暴露的接口全部为超类/父类中的方法,而SubClass中的特有的方法将 被“屏蔽”;
2) 若SubClass中重写了SuperClass中的方法,则在调用该方法时,父 ...
每个应用都有生命周期lifecycle,可能包括init,start,stop,destroy等更多。针对生命周期的变化,如何做变化作出反应,tomcat在设计的时候,把时间监听listener结合起来,所以listener取的名字是lifecyclelistener,对lifecycle进行监听。
总的最底层的来自两个interface的设计Lifecycle和LifecycleListener。
lifecycle这个接口定义了除本身生命周期的函数,另外还定义了整个生命周期阶段的事件类型(这个肯定是为lifecyclelistener准备的),同时还对LifecycleListener有 ...
这里说下tomcat对DynamicMBean的实现和封装。利用tomcat包,可以轻松实现将自己的对象注册为MBeans。
看个例子就明白了。
package com.MBean.test;
import org.apache.tomcat.util.modeler.BaseNotificationBroadcaster;
public class DyMBeanObj extends BaseNotificationBroadcaster{
public int getConnectionNumber() {
return this.conNum ...
先说JMX,The JMX technology provides a simple, standard way of managing resources
such as applications, devices, and services.
JMX是为了管理资源产生的,这个资源包括应用、设备和服务等。取个例子,如果你写了一个应用,初始化了20个的数据连接数,当你的应用还在跑的时候,发觉这个连接数少了,你要增加这个参数。JMX提供不需要停机,动态的管理连接数的方法。
先从简单的Standard MBeans看起。
通常我们先定义interface
第一步:MBean Interf ...
Server的中的初始化基本核心在StandardServer中,下面的代码
protected void initInternal() throws LifecycleException {
super.initInternal();
// Register global String cache
// Note although the cache is global, if there are multiple Servers
// present in the JVM (may ha ...
getServer().init()其实就是调用server的init函数,但是server是个interface,还要看其在new的时候,这个就是多态。
digester.addObjectCreate("Server",
"org.apache.catalina.core.StandardServer",
"className");
digester.add ...
接下来tomcat要load了,看下面一些程序片段
public void load() {
long t1 = System.nanoTime();
initDirs();
initNaming();
Digester digester = createStartDigester();
........
digester.push(this);
digester.parse(inputSource);
........
get ...