web.xml配置的servlet加载两次的原因及解决方法

遇到的问题描述:

最近在做web项目时遇到了两个奇葩问题:

1、先遇到了这个缓存问题:系统参数对象缓存到了静态变量里,并且用一个通知型任务重新加载数据库修改后的参数,之后奇葩问题便出现了,重新加载后再调用系统参数常量,有时会得到修改后的有时得到的还是修改前的参数。后来发现重新加载时赋给静态变量的对象和再次调用静态变量得到的对象hashcode有时一样有时不一样。一直没找到解决方法作为了待解决问题。

2、出现上面问题不久,一个监控项目也出现了怪问题:就是每分钟检测指定项目,如果不能访问便发一条短信,并且一段时间内不再重复发送。问题是每次项目不能访问时都会发两条短信,并且发送时间相隔1秒。


问题查找:

遇到第2个问题后,最开始以为控制发一次后一段时间内不再发送这块代码有问题,仔细查看发现这块没问题。后来调试时发现这段代码被调了两次并且间隔1秒,便进一步查找,最后发现web.xml里配置的servlet执行了两次,也就是产生了两条线程监控项目,所以会发两次。按下面的方式改过之后,上面两个问题都解决掉了。


根本问题:启动tomcat时,web.xml配的servlet加载了两次,导致这个问题的根源是:在tomcat的配置文件server.xml里配置了项目(为了设置不加项目名访问),项目又放在了webapps文件夹里。webapps里的项目tomcat会自动加载,server.xml配置的项目又加载了一次,所以加载了两次


解决方法:

方法一:将webapps里的项目代码移到外面一个其他路径,在server.xml里用docBase指定代码路径,如tomcat根目录创建一个code文件夹存放代码:

 <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<span style="white-space:pre">	</span><Context docBase="/usr/local/tomcat/code/project" path="" reloadable="true"/>
 </Host>

方法二:去掉server.xml里自己手动配置项目,直接使用webapps目录项目的项目


























你可能感兴趣的:(tomcat,web.xml,两次加载)