首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

jetty源码分析五-deploy

2013-11-09 
jetty源码分析5-deploy1.概述1. jetty的deploymentManager作用是帮助创建ContextHandler并加入到jetty的合

jetty源码分析5-deploy
1.概述

1. jetty的deploymentManager作用是帮助创建ContextHandler并加入到jetty的合适位置,以方便提供静态和动态的服务。比如,把某个位置的war包部署到jetty。


2. deploymentManager一个主要功能是连接app Provider和applifecycle。

?

3. 有两种典型的appProvider,一种是webappProvider,主要是监视某目录的*.war,并把他们提交到app lifecycle graph中。一种是contextProvider,监视一个目录的*.xml文件,并用jetty xml为app lifecycle graph创建contextHandler(通常是WebAppContext),后者可以通过依赖注入的方式为webappContext注入更多的内容,比如classloader。


4. webAppProvider的start和stop和server是同步的,server.start的时候调用deployer的start。context是在将要部署的war包中发现的。在monitoredDirName中的所有war包和名称非CVS的目录都会被部署,war包的context名称是包名,root.war是/.如果extractWars被设置为true,那么war包会先被解压到一个tmp dir(事实上,即使为false,WEB-INFO中的class文件夹和lib下的jar包也会被解压到其临时目录的webinf\WEB-INF\下,但是其他的一些war包中的文件就不会被解压)。如果有未编译的jsp等东西,就会出问题(比如war包没有解压,servletContxt.getRealPath某些文件就会返回一个null)

?

2.初始化过程

在使用java -jar start.jar命令启动时,start.jar 的main函数在解析完命令行,设置好classpath等后调用invokeMain时,默认是调用Xmlconfiguration的main函数,这里会把一个个的xml拿出来解析(通过configure函数),参照文档中的标签逐一处理,代码如下:


?

?

3.1 启动并开始扫描

?在jetty的server调用server.start()的时候,会调用到DeploymentManager的dostart()方法如下:

?

?

从可以看到,new出来的Scanner是个核心逻辑,其start方法会调用scan方法,代码如下:

    protected void fileChanged(String filename) throws Exception    {        if (Log.isDebugEnabled()) Log.debug("changed ",filename);        App app = _appMap.remove(filename);        if (app != null)        {            _deploymentManager.removeApp(app);        }        app = ScanningAppProvider.this.createApp(filename);        if (app != null)        {            _appMap.put(filename,app);            _deploymentManager.addApp(app);        }    }

deploymentManager会触发requestAppGoal(entry.app,AppLifeCycle.UNDEPLOYED);根据上面图的描述,通过stopping和undeploying过程,回到UNDEPLOYED的状态,其过程比新增简单,有兴趣的同学可以看看StandardStopper,StandardUnDeployer对对应方法。

StandardStopper基本上就是调用handler的stop方法,正在处理过程中的请求时不会受影响的。

在StandardUnDeployer的undeploy过程中,主要就是移除context(handlerConnection)对于webappContext的引用,方便在合适的时机由jvm将这个webappContext回收掉。但是,如果这个webappContext已经有了一些线程级别的东西,比如起了定时钟线程,远程调用线程,就有可能回收不掉。这时大型应用使用setScanInterval需要注意的地方。

?

换句话说,这就是我们平时看到setScanInterval后可以动态感知改动并重新部署应用的特性。在小型系统的开发中很常用(tomcat也早就有了)但是需要注意这里是重新部署而不是jvm层面的热替换之类,因此如果应用启动过程很长,或者应用消耗内存很大,都是不适用的。一般生产环境都要慎用这个属性。?

?

5.其他问题
    对于拷贝到webapp目录下就可以服务的静态文件,主要是因为servletHandler有个default的Servlet,叫org.eclipse.jetty.servlet.DefaultServlet可以提供静态资源服务的。WebAppContext是一个HandlerWrapper,他具体的handler是在start的过程中new出来的。具体在ServletContextHandler的startContext方法中。
?6.参考文献:?

1. http://wiki.eclipse.org/Jetty/Feature/Deployment_Manager

热点排行