前段时间,做一个定时任务:通过监听器(Listener)和定时器(Timer)定时执行某个任务(Task),时间是一天一次
刚开始在本机上执行是很正常,结果发到服务器上(linux系统)上发觉定时任务一下子执行了三次,间隔很短(几秒),一开始以为是定时器(Timer)与linux系统的一个bug...一直无解,后来在网上查了相关资料才发觉,这是tomcat配置的问题。
tomcat 的server.xml 中配置了多个 Host name,里面所配置的appBase有好几个然后都会执行一次,解决方案嘛只留一个localhost的appBase="webapps" 其他都用nginx或者apache做域名重定向来解决即可。
一开始的tomcat下面是只有一个hostnames配置,这时是很正常,定时任务只执行一次,如果你在这结点下面再配
<Context path="" debug="0" docBase="/opt/tomcat7/webapps/Message" reloadable="true" privileged="true">
</Context>
等信息,就会出现多次执行。
至于原理还不是很清楚。但tomcat启动,一开始是默认启动webapps 下所有项目,这时定时任务执行一次,如果
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" debug="0" docBase="/opt/tomcat7/webapps/Message" reloadable="true" privileged="true">
</Context>
Host结点又配置一次,这里定时任务又要执行一次,所以如果多个hostname,会出现执行多次定时任务
最终的解决就是host只保留一个,context path也不要加上。