Tomcat中ServletContextListener监听器重复执行的问题
系统已经投入使用,还有些后续开发要做。系统需要每天从另一台数据库服务器获取数据,因为数据量比较大,又不能影响系统正常使用,所以将数据同步放在凌晨。这里做了一个Tomcat的ServletContextListener监听,在系统启动时创建一个定时器,在定时器任务中判断时间并完成数据同步。这步怎么做网上有很多资料,就不再说明了。
问题是,系统部署到Tomcat下之后,在日志中看到,这个数据同步任务会在几乎同时执行2次!开始以为是我的线程同步没有写好,改了几次还是不行。在日志中打印出定时器类的内存地址,发现有两个不同的地址,又想我在不久前扩大了jvm的堆栈空间大小,会不会是启动了2个jvm,发现也不是。此时感觉到应该不是代码的问题。可能是Tomcat什么地方没有设置好。
想想ServletContextListener是在项目启动时执行的,又联想到在Tomcat的管理界面是显示有两个同名的系统,终于豁然开朗!
原因是这样的,我将项目的war包放在webapps目录下,Tomcat启动时会解压并部署。然后在Tomcat的server.xml中配置了虚拟目录,让用户输入网站域名可以直接访问。这样就在Tomcat下启动了两个项目系统,虽然用户只用其中一个系统,但两个系统中的ServletContextListener的定时器都会执行。所以只需要将项目放到其他目录,只要不在webapps目录下就行。经测试,问题解决!
?
转载请注明出处:http://wangfeizy.iteye.com/blog/1336545