项目涉及到定时任务,用的spring自带的定时任务
<task:scheduler id="scheduler"/>
<task:scheduled-tasks scheduler="scheduler">
<task:scheduled ref="scheduledTaskOilQuery" method="addCollectOil" cron="0 */1 * * * ?"/>
</task:scheduled-tasks>
部署到服务器上,却发现定时任务执行的结果总是重复一次。刚开始以为是数据本身问题。后查看日志,定时任务每次都执行了两遍。因为执行的时间一样,除了微妙级别有差异。
这类问题,网上也有类似的解答,但不符合我的实际情况。但查找问题的方向一致:定时任务很可能被加载了两次或多次。
网上的一类问题是配置文件的疏忽导致,定时任务所在spring配置文件被加载了两次。具体原因是有些配置用了通配符配置了一次,又明确的指定了一次,或是spring容器按默认的规则加载了一次。而你的配置文件正好是默认名,默认路径。详细的可以到网上搜索。
重点说我遇到的问题。检查配置后确认不是配置文件的问题。猜想有可能是整个项目加载了两次。
一般项目文件在tomcat的webapps目录下放置,又在server.xml中通过<context>节点配置了一次,且path名称配置的还与工程名(webapps下的)不一致,又可能因为这个项目加载了多次。
比如在webapps下工程为myweb,server.xml中为了简化访问路径又通过<contex path="web" docbase="myweb">配置了一次。当我们在浏览器访问时,两个路径都是可以访问的。且在工程中上下文是不一样的。
所以解决方法是,1.去掉server.xml中的配置;2:server.xml中的配置path名称改成与工程一致(这也就失去了配置的意义);3:工程文件不放在webapps目录下,移到外部任何目录。server.xml中的context节点中的docbase做相应的改动。
还有一种很隐蔽的问题会导致类似情况,甚至会出现很多并发症。当项目中有随项目启动而启动的后台任务,在tomcat关闭时本应该结束的。却由于资源的释放一直没有处理好,导致
项目结束不掉。处于一种半运行半停止的状态。多次重启tomcat就会有多个项目实例一样。出现的问题就不止是任务执行多次了。还会有其他觉得很奇怪的问题。