这是一个很有意思的问题困扰了一段时间,当我开发的一个系统使用了Quartz任务调度模块进行定时任务,在本机下运行没有问题。当部署到正式机上时,发现数据出现了不按期望的值的结果。原因就是任务执行了两次第二次把第一次的任务结果给修改了。关键是如何产生的这种情况。Google了一番,大家说到的原因主要是因为Tomcat下虚拟主机的配置造成的,比如我的域名叫作www.abc.com,那么默认的虚拟主机配置就是在server.xml文件下添加如下配置信息:
<Host name="www.abc.com" appBase="webapps"
unpackWARs="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="." reloadable="true" crossContext="true"/>
</Host>
注意系统中原来默认配置主Host name=locahost也有一项其appBase也是webapps,问题就出在这里,每次Tomcat启动后,系统加载了name为localhost和www.abc.com的应用中的任务监听器各一次,这样肯定导致有两个任务管理器实例在运行,从而导致到点执行时会出现两个(如果虚拟主机多会产生多个)同时执行的任务。从而产生不良后果。
修改之后
<Host name="www.abc.com" appBase=""
unpackWARs="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" docBase="app2/abc" reloadable="true" crossContext="true"/>
</Host>
注意,这里将appBase置空,而使用docBase来设置应用路径,当然也可以用appBase="app2/abc",docBase="."来写。需要注意的是app2是建立在tomcat目录下,与webapps平级的一个文件夹。将应用abc目录发布到这里即可。
path属性,是用来指定访问该应用的路径名的。如果留空,则当输入http://www.abc.com:8080/就自动访问到了abc目录下的应用,当指定path="/abc"时,需要输入http://www.abc.com:8080/abc/才能够访问abc下的目录。
简单和同事研究试验了一番,粗浅的结论。需要以后不断细化深入了解Tomcat的配置。