Quartz Task在Tomcat中重复运行问题解决

本文介绍了Spring Quartz在Tomcat环境中意外重复运行任务的问题。通过日志发现,任务不是由同一个实例执行,原因是Tomcat的自动部署特性导致应用被加载两次。解决方案包括调整工程目录、修改配置或关闭自动部署功能。建议在生产环境中谨慎使用自动部署,以免引发不必要的问题。
摘要由CSDN通过智能技术生成

问题描述

Spring Quartz是很常用的定时任务框架。把一个Quartz的工程部署到Tomcat中启动,意外地发现,每个Task都在同一时间跑了两次,而本地在开发的过程中却没有问题。

问题排查

为了防止多线程问题,有部分Task上是加了锁的,类似如下方式:

@Component
public class ExampleTask{
   
	private ReentrantLock lock = new ReentrantLock();
    protected void executeInternal(){
   
    	if (lock.tryLock()) {
   
            try {
   
                // task main logic
            } finally {
   
                lock.unlock();
            }
        }
    }
}

按理说,SpringBean默认是单例的,加了锁之后,同一时间,只会有一个线程能拿到锁,然后执行Task的逻辑才对。难道锁不生效?于是我们又新增了类似如下日志,把ReentrantLock对象和this都打印出来:

logger
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值