中科院云平台架构师,专注于数字化、智能化,技术方向:云、Linux内核、AI、MES/ERP/CRM/OA、物联网、传感器、大数据、ML、微服务。
分类: Java
2006-02-22 09:34:53
我们知道在使用Tomcat时,如果设置了reload后,Tomcat会自动侦测WEB-INF目录下修改过的资源。如果发现有变化(通常是依据文件的lastModified值),便会自动重新载入所有的资源。表面上看,似乎是个很好的主意:不用重新启动Tomcat便可以更新我们的Web应。尤其是在调试阶段,只需简单的更新我们的代码,就可以重新测试了。然而美丽的表面总是隐藏着不可测的秘密。
最近在使用Tomcat时,就遇到了一个有趣的问题,简单当时困扰了我很久(也许是因为我比较笨)。到这里和大家分享一下。
我在WebApp应用中有一个daemon 线程,用来定时监视某个状态的改变。如果没有改变就sleep一段时间,否则进行某些相应的处理。类似如下的代码:
在Constructor中构造这个线程,每隔10秒钟工作一次
这个类作为某个WebApp中的一个组件,因此最初的入口还是一个Servlet。当我为了debug,而重新编译代码并重新发布我的WebApp后,发现原先生成的线程仍旧在工作,而同时Tomcat也将新编译的代码载入内存,因此这时JVM中有了两个监视的线程在工作,因此会有不可预料的问题。但是这不仅仅是两个独立的工作线程的问题,虽然表面上如此。我修改了一下代码,添加了一个测试用的work方法,如下:
跟踪一些JVM内部的信息 | ||||
LOG.info("TestReload "+TestReload.class.hashCode());用来输出TestReload的Class的hashCode值。 LOG.info("The class Loader is "_ + cl.getClass().getName()+ " : " + cl.hashCode())用来输出加载这个TestClass的Class的ClassLoader的名字和hashCode。 然后用一个简单的Servlet作为程序的入口: 这个Servlet只是简单的要求ClassLoader载入TestClass的Class并且进行Class的初始化和相应的静态初始化。 我们来看一下试验的输出 当WebApp第一次运行时,屏幕输出入下:
|