spring中定时任务执行多次问题排解

本文探讨了Spring定时任务在部署到服务器后出现重复执行的问题。分析了可能是由于项目加载多次或配置文件被重复加载等原因造成,并提供了几种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目涉及到定时任务,用的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就会有多个项目实例一样。出现的问题就不止是任务执行多次了。还会有其他觉得很奇怪的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值