tomcat 加载一个类两次
有一个项目使用 tomcat 作为服务器,部署好后,发现同一个 Quartz Job 类被加载两次,导致了相同的任务被执行两次,这是一个比较严重的问题。
解决方法
一开始猜测是由于有多个 tomcat 实例被启动,而每个实例启动了一个应用。但发现不是,因为对于同一个端口只能有一个应用被启动,所以否定了这个猜测。
后来通过查阅资料了解到,tomcat 对一个 web 应用会有一个类加载器,所以猜测是tomcat加载了两次应用,故导致类被加载了两次。后来查看 tomcat/conf/server.xml 文件,发现果然配置有误:
“` xml
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<Context docBase="D:\apache-tomcat-8.0.24\wtpwebapps\webank_web_dms" path="/webank_web_dms" reloadable="false" source="org.eclipse.jst.jee.server:webank_web_dms"/></Host>
上面配置中,指定了两个应用目录:webapps 和 D:\apache-tomcat-8.0.24\wtpwebapps\webank_web_dms ,若它们下面都存在 webank_web_dms 这个应用,则会被分别加载,所以解决方法是,清空 <Context> 即可。