tomcat启动之后,一个项目由两个线程启动的问题

本文探讨了Tomcat启动时项目被加载两次的问题,原因在于service.xml中Host节点配置了额外的Context标签。分析了Host节点与Context的关系,指出当Context配置的docBase与webapps目录下的项目位置重合时,会导致项目加载两次。通过调整Host配置,可以避免此类问题,确保项目正确、唯一地启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

期初在使用eclipse开发项目的时候,偶然的一次发现,我们的配置配件加载了两遍,当时不影响正常使用,也就没在意。

后期发现同事们都只加载一遍配置文件,这时候我就意识到问题了,当时是由于我在eclipse配置tomcat启动目录在webapps目录下,但是同事们都在eclipse默认的wtswebapps目录下,所以当时我就将目录进行迁移,之后发现配置文件只加载一次了。


就在前几天,生产上出现了一起重复请求的运维问题,我就想到了这个事情了。


经过研究发现问题出现在tomcat下面的conf目录里面的service.xml配置文件里面的Host节点。

纯净的Host节点配置如下:

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />

      </Host>

仅有一个日志的配置。

然后我查看之前eclipse启动项目的tomcat的Host节点发现

 <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        <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="F:/Tomcat7/apache-tomcat-7.0.62/webapps/ssacWechat_uat" path="/ssacWechat" reloadable="true" 
	source="org.eclipse.jst.jee.server:ssacWechat_uat"/>
 </Host>


多了一个Context的标签,里面配置项目的路径,与项目对于的rootpath,而修改过tomcat路径的项目host配置为:

  <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        <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="F:/Tomcat7/apache-tomcat-7.0.62/wtswebapps/ssacWechat_uat" path="/ssacWechat" reloadable="true" 
	source="org.eclipse.jst.jee.server:ssacWechat_uat"/>
 </Host>



看出来问题了吗?

就是说如果Context标签下面的项目,tomcat还会重新加载一遍。

对于service.xml里面Host标签的意思就是,tomcat会优先加载webapps目录下面的项目,当加载完成之后会选择Host节点里面的Context节点对应的项目,这样如果Context节点里面的项目位置恰好在该tomcat下的webapps目录里面的话就会造成同一个项目加载了两遍。(docBase属性代表项目的路径,这里可以使用相对路径或者是绝对路径[相遇对webapps目录而言]path代表web访问的rootPath)


比如说我将Host配置成如下配置:

 <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        <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="F:/Tomcat7/apache-tomcat-7.0.62/webapps/ssacWechat" path="/ssacWechat" reloadable="true" 
	source="org.eclipse.jst.jee.server:ssacWechat_uat"/>
	-->
	<Context path="/" docBase="ssacWechat" debug="0" reloadable="true"/>
 </Host>

使用start.bat启动tomcat的时候会发现,项目同样是加载了两遍,但是我访问localhost:8080/ssacWechat路径时,发现可以正常进入项目的index页面。

(这时候走的是tomcat目录下webapps加载的项目)

然后我访问localhost:8080/路径是发现也可以进入项目的index页面

(这时候走的是Host标签下面配置的Context里面的项目,所以用/就可以访问到)


以上就是我的总结,如有不足请提出,我会进行修正的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值