tomcat部署方式引发定时任务被同时执行了多次

同学们是不是遇到过,一个定时任务程序,比如定时发送信息,同一个人收到了多条信息。感觉就像是并发一样,然后把相关配置都检查了一遍都没发现问题。

问题在哪里?首先先确认你的应用程序是不是对请求上下文(即contentpath)有特殊要求,比如项目工程名为website,但是需要以http://127.0.0.1/app/website访问,因此在tomcat的server.xml做了如下配置

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
		<Context path="/app/website" docBase="website"  />
	  </Host>

然后将website.war放在webapps下面,启动tomcat后,就会出现website和app#website两个文件夹。然后你会发现在浏览器中可以通过http://127.0.0.1/app/website和http://127.0.0.1/website都能访问,到这里你发现问题了吗?既然都能访问,说明存在两个web程序,即使你把app#website删掉,/app/website一样也能访问。如果你把website删掉,很不幸app#website启动失败。

为什么会这样呢?这就得从tomcat部署方式说起,这里我们简单描述一下

<!--
	appBase:web程序位置,可以是绝对路径也可以是catalina.base的相对路径 
	在appBase路径下创建的一级目录名称默认为web程序的上下文路径
-->
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
	<!--
		配置自定义的上下文
		path:上下文路径
		docBase:web程序位置,绝对路径或appBase的相对路径
	-->
	<Context path="/app/website" docBase="website"  />
</Host>

根据上述描述,启动tomcat后,由于website放在webapps下,所以会有一个/website的web程序,然后Context又配置了一个/app/website的web程序。这样就是两个web程序,所以定时任务同时执行了。

如何解决?

<!-- 方式一:将web程序从webapps下移除,比如放到d盘 -->
<Context path="/app/website" docBase="d:\website"  />

<!-- 
	方式二:忽略webapps下的一级目录,deployIgnore="website",即webapps/website文件夹将不再作为web程序运行
	deployIgnore:该值可以使用正则表达式,忽略多个deployIgnore="app1|app2|app3"
	如果是程序war包部署,待war解压后,停掉tomcat,把多出的app#website以及war包都要删掉,否则/website仍然可以访问
-->
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true" deployIgnore="website">

现在试一试,只有http://127.0.0.1/app/website可以访问了,http://127.0.0.1/website出现404,问题解决。

发布了64 篇原创文章 · 获赞 0 · 访问量 3202

猜你喜欢

转载自blog.csdn.net/q42368773/article/details/103370014