Jfina 定时任务JOB重复执行问题,因为同一webapps下多实例原因

本文记录了一次因在同一webapps目录下存在两个实例而引发的数据重复问题。问题表现为同一任务在同一时刻运行了两次,导致数据double。通过检查日志发现异常,并最终定位到额外的备份实例未被删除。删除多余实例后,问题得以解决。强调了webapps目录下只能存在一个实例的重要性。

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

    今天用户反馈,数据double了。

   咦,这问题好久没报过了,怎么又如幽灵般出现了?

 

   首先,查日志,发现在同一个时刻,同一个任务run了2条:

几乎是同时start,同时end。

 

找了同事一块查,一时无果。

最后想起来,在前天部署服务时,tomcat/webapps/有2个实例,另一个备份用的实例忘记删除了,应该是这个原因。

立即删除此备份实例,故障消除。

 

总结:同一个webapps/只能有一个实例!

### 解决 Quartz 定时任务偶尔未执行问题 #### 调整线程池大小 如果发现某些定时任务未能按时触发,可能是因为当前配置的Quartz执行线程数不足。对于较老版本如1.5.2而言,直接修改`quartz.properties`文件来增加线程数目不可行;但是可以通过XML方式设置,在`quartz.xml`中指定更高的并发度以确保更多任务能够被及时处理[^3]。 ```xml <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- ...其他配置... --> <property name="threadPoolProperties"> <props> <prop key="org.quartz.threadPool.threadCount">20</prop> <!-- 将此数值设为更合适的应用需求 --> </props> </property> </bean> ``` #### 处理集群环境中的竞争条件 当多个节点组成集群部署应用时,可能会遇到同一时刻不同服务器尝试启动相同实例的情况,从而造成部分任务看似丢失的现象。为了防止这种情况发生,可以采用Redis实现分布式锁机制,保证即使是在多实例环境下也能有序地控制单个任务只在一个地方被执行一次[^4]。 #### 修改Tomcat配置避免上下文加载异常 有时Web容器本身的配置不当也会引发此类问题。例如,在Apache Tomcat环境中适当调整其主机标签内的参数有助于改善这一状况: - `appBase`: 设置为空字符串; - `docBase`: 明确给出项目根目录的具体位置而非相对路径。 具体做法如下所示[^5]: ```xml <Host name="localhost" appBase="" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b"/> <Context path="" docBase="/path/to/your/project/webapps/demo" reloadable="true"/> </Host> ``` 通过上述措施之一或组合运用,通常能有效减少乃至杜绝Spring Boot集成Quartz过程中出现的任务遗漏现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值