基于redis分布式锁实现quartz调度集群
要求:不使用quartz创建表。
1.springboot工程,quartz创建job由spring管理,具体方式详见:
2.配置redis分布式锁,具体方式详见:
3.采用triggerListener来实现
import org.quartz.JobExecutionContext;
import org.quartz.JobKey;
import org.quartz.Trigger;
import org.quartz.TriggerListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SimpleTriggerListener implements TriggerListener {
private Logger logger = LoggerFactory.getLogger(SimpleTriggerListener.class);
@Override
public String getName() {
return "SimpleTriggerListener";
}
@Override
public void triggerFired(Trigger trigger, JobExecutionContext context) {}
/**
* 在 Trigger 触发后,Job 将要被执行时由 Scheduler 调用这个方法。
* 假如这个方法返回 true,这个 Job 将不会为此次 Trigger 触发而得到执行。
*/
@Override
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
logger.info("=====》 trigger开始执行,开始获取redis锁");
RedisDistributedLock distributedLock = SpringUtil.getBean(RedisDistributedLock.class);
JobKey jobKey = trigger.getJobKey();
String lockKey =jobKey.getGroup()+":"+jobKey.getName();
boolean flag = distributedLock.lock(lockKey);
if(!flag){
//获取到锁了
logger.warn("没获取到锁,本次调度结束");
return true;
}
logger.info("获取到锁了,继续往下执行");
return false;
}
@Override
public void triggerMisfired(Trigger trigger) { }
@Override
public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) {
logger.info("调度执行完毕,开始释放锁");
RedisDistributedLock distributedLock = SpringUtil.getBean(RedisDistributedLock.class);
JobKey jobKey = trigger.getJobKey();
String lockKey =jobKey.getGroup()+":"+jobKey.getName();
distributedLock.unLock(lockKey);
logger.error("本次作业执行结束==============》");
}
}
5.修改QuartzConfig,注册自己的triggerListener
5.进行测试,两个工程测试:
一个工程打印日志:
第二个工程打印日志