您的位置:首页 > 运维架构 > Tomcat

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

2017-09-07 11:21 591 查看
期初在使用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里面的项目,所以用/就可以访问到)

以上就是我的总结,如有不足请提出,我会进行修正的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐