基于redis分布式锁实现quartz调度集群

基于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.进行测试,两个工程测试:

一个工程打印日志:

第二个工程打印日志