本次遇到这个问题是这样一个场景,某些计算需要较长的时间,并且监控的周期会比较短。每3S监控一次,且执行周期最长已经超过6S,由于定时任务执行逻辑下一次依赖上一次的结果,在并发执行的情况下,会导致计算错误,因此必须要限制并发执行。
在开发单个节点的时候,没有问题,当部署了多个执行节点的时候,任务被并发的执行了。难道回到单节点模式?这样定时任务的高可用就没用了!
好了,现在的问题是。DisallowConcurrentExecution没有做到真正的多机禁止非并发执行!
解决方案是,增加分布式锁。为了不增加架构复杂度,直接引入了redisson红锁来进行处理。增加了BaseQuartzJob,在任务里识别DisallowConcurrentExecution的Annotation来进行加锁,等于是把互锁的机制增强,以免增加新的annotation。当然分布式锁你也可以用zookeeper,这里只是一个实现思路。
public abstract class BaseQuartzJob implements Job, Runnable{
private static final String CONCURRENT_LOCK = "ConcurrentLock";
@Autowired
private RedissonClient redissonClient;
private String lockJobClass;
public BaseQuartzJob() {
DisallowConcurrentExecution disallowConcurrentExecution = getClass().getAnnotation(DisallowConcurrentExecution.class);
if(disallowConcurrentExecution != null) {
lockJobClass = getClass().getSimpleName() + CONCURRENT_LOCK;
}
}
@Override

本文介绍了在多节点部署时,由于定时任务执行周期与监控间隔冲突导致的并发执行错误。为了解决这个问题,提出了使用Redisson红锁作为分布式锁的方案,通过在BaseQuartzJob中检测并加锁,确保同一时间只有一个节点执行任务。此外,示例中展示了如何在ErpDockingJob类中应用此策略,确保全节点唯一执行。

1120

被折叠的 条评论
为什么被折叠?



