How Tomcat works 之第十二章之重新载入支持

来源:互联网 发布:织梦cms用户名不存在 编辑:程序博客网 时间:2024/04/30 06:21

StandardContext的reloadable属性表示这个应用能否重新载入。当可以重载的时候,如果web.xml文件变化了或者WEB-INF/classes目录下的一个文件重新编译了,应用将会重新加载。

 

StandardContext依靠它的加载器重新载入应用。在Tomcat 4中,WebAppLoader类,StandardContext的Loader的实现类,有一个线程来检查WEB-INF目录下所有classes和jar文件的时间戳。你所需做的是启动与StandardContext中WebAppLoader相关的线程,这个调用WebAppLoader的setContainer方法完成。代码如下:

 




看最后的一部分,如果Container是一个context,调用了setReloadable方法。意味着,WebAppLoader实例的reloadable属性的值与StandardContext实例中的reloadable属性值相同。

 

 

下面是WebAppLoader类中setReloadable方法的代码实现:



如果reloadable属性从false变为true,就调用threadStart方法。如果从true变为false,threadStop方法调用。threadStart方法开启一个指定线程来持续的检查WEB-INF中的class和jar文件的时间戳。threadStop方法停止这个线程。

The backgroundProcess方法

 

一个上下文需要其他组件的帮忙,比如加载器和管理器。通常这些组件需要一个单独线程来着手后台处理。例如,支持重新载入的加载器需要一个线程来周期性的检查WEB-INF所有class和JAR文件的时间戳。一个管理器需要一个线程来检查它管理的session对象的终结时间。在Tomcat 4中,那些组件在它们自己的线程中结束。

 

 

为了保存资源,Tomcat 5使用了一种不同的方式。所有的后台处理共享相同的线程。如果一个组件或者一个容器需要周期性的操作,它所需要做的是在它的backgroundProcess方法中写代码。

 

共享的线程在一个ContainerBase对象中创建。ContainerBase类在它的start方法中调用它的threadStart方法(即容器启动的时候)


threadStart方法构造了一个新的线程,传递了ContainerBackgroundProcess类的实例,其实现了java.lang.Runnable接口。ContainerBackgroundProcess类的代码如下:








这个类是ContainerBase的内部类。在它的run方法中是一个while循环周期性的调用它的processChildren方法。processChildren方法反过来调用backgroundPrcocess方法和它的子类中每个processChild方法。通过实现了backgroundProcess方法,ContainerBase的子类能有一个指定的线程来运行周期性任务,比如检查classes的时间戳或者会话对象的终结时间。下面显示了Tomcat 5中StandardContext的backgroundProcess方法。



总结

 

在这一章了解StandardContext类以及相关类。也了解了一个StandardContext实例是如何被配置和当一个请求到来是StandardContext内部发生了什么。最后一块讨论了Tomcat 5中backgroundProcess的实现。


0 0
原创粉丝点击