微信号:gh_7b30a45c1595

介绍:致力于营造国内一流的应用服务器的爱好者技术讨论,服务器相关资讯新闻分享,业界开源商用服务器相关动态,服务器端程序员职业发展相关的圈子; 以JAVA技术为基础扩展其它语言,讨论tomcat,JAVA EE规范,JVM,操...

聊聊Tomcat的特有的context.reload重加载

2017-01-15 11:27 feiying



这个context.reload是Tomcat特有的重加载方法,其目的是高效的对应用的一些class和web.xml等核心配置的修改,做出反应,并在最短时间内重新将应用准备好;


1.context.reload

怎么理解这个context.reload呢,我们看看这个方法究竟做了什么?

其实一共做了两件事:


a. 让请求暂停,当context调用reload方法,请求链路中不能继续向下执行了,因为当前应用的状态已经发生改变,例如很有可能wrapper类消失了,你的这次请求就没有意义了;


让请求暂停是通过一个标识,在CoyoteAdapter的postParseRequest方法中,当看到请求的应用处于暂停的时候,休息1秒钟,然后再继续:

 

休息这个1秒钟,其实足够了,因为context的reload都是内存操作,没有IO阻塞的东西,如果当前计算机比较快的话,基本上就是几微妙甚至是1微妙就能搞定的事,所以这里休息1秒钟我觉得是有情可原的;


b.stop,start方法


生命周期方法,基本上每一个Tomcat后端容器都有这样的一个方法,继承和实现lifecycleBase:

 

其主要作用就是设置一些状态,然后调用容器组件去进行startInternal或者stopInternal


如上述的stop,它的主要作用是停止当前的StandardContext,看看StandardContext的stopInternal都干了啥?

这其中我们前面讲过的WebappClassLoader的clearReferencesXXX,仅仅是其中卸载和清理的一项而已,还有如此之多的东西需要关闭;


那我们再来看看StandardContext的startInternal方法:

 startInternal方法的流程非常的复杂,基本上经过需要20多个步骤,才能将应用启动起来。


2.modified方法(什么时候reload呢?)

 那什么时候进行reload呢?


需要关注一下modified方法,其调用的就是ClassLoader的modified方法:

 

我们通过代码分析,WebappClassLoader中的resourceEntirs维护的除了classes,还有web.xml,

那么我们就可以总结出来什么时候reload的三点:

a.web.xml的修改

b.load的classes(不仅仅是web-inf/classes下面的)

c.jar资源是否有修改或者文件增删


需要注意的是,classes如果有增加,不会reload,因为当你访问这个新的classes的时候,只要你新增的class在WebappClassLoader的库中,它自动就会找到;

当class被删掉或者修改了,会reload,毕竟file.lastmodified不一样了嘛,这一点是需要留意的;


总结:

本文介绍了一下context.reload,总结一下就是当classes,jar和web.xml发生一些变化的时候,context才回reload,而reload的实际操作就是StandardContext重新stop又start了一下,而这个过程除了classes的能重新加载以外,对于web.xml中定义的一些资源,如listener,filter,servlet等也可以重新读取;


但是,StandardContext在Tomcat配置的一些属性如果修改了,例如你修改context.xml的一些配置,reload就不好使了,而这个就是由重部署来进行解决了;


再次重申,本文讲的context.reload是应用重新加载,针对classes,jar和web.xml的变化,目的是超级快速的就能恢复应用访问,不同于重部署;


那么,什么是Tomcat的重部署呢?

咱们下一篇见!


 
应用服务器技术讨论圈 更多文章 聊聊应用卸载之后的WebAppClassLoader究竟要清空哪些垃圾资源? Tomcat8+引入的并发ClassLoader 配置Tomcat的Loader组件(Nested Component之三) 配置Tomcat的Loader组件(Nested Component之三) 坚持是一种什么力量?
猜您喜欢 为了腾讯云,马化腾不仅亲自上阵,还约了郁亮、俞敏洪、方洪波等百名大咖 配置 Docker 镜像下载的本地 mirror 服务 抛开前端自己干(三) Python基础教程3:基础语法 腾讯社会招聘和毕业生实习招聘内推了