如果@DisallowConcurrentExecution,如何取消Quartz作业而不是入队

时间:2016-02-18 11:49:06

标签: java quartz-scheduler

Quartz在@DisallowConcurrentExecution的情况下,如果正在执行相同的作业(JobA)实例,则为作业(JobA)设置。但我想取消那份工作,而不是将其排队等待执行

2 个答案:

答案 0 :(得分:0)

我有一个使用TriggerListeners的解决方案,但是使用此解决方案,您无法触发多个作业

class CustomTriggerListener extends TriggerListenerSupport {

    private JobExecutionContext lastJobExecutionContext;

    @Override
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
        boolean vetoExecution = false;
        if (lastJobExecutionContext == null) {
            lastJobExecutionContext = context;
        } else {
            boolean lastJobIsDone = lastJobExecutionContext.getJobRunTime() >= 0;

            if (lastJobIsDone) {
                lastJobExecutionContext = context;
            } else {
                vetoExecution = true;
            }
        }

        return vetoExecution;
    }

    @Override
    public String getName() {
        return "CustomTriggerListener";
    }

}

答案 1 :(得分:0)

检查作业是否已在运行,如果是,则中断此作业

for (int i = 0; i < scheduler.getCurrentlyExecutingJobs().size(); i++) {
    if(scheduler.getCurrentlyExecutingJobs().get(i).
                        getJobDetail().getKey().getName().equals(jobName)) {
            scheduler.interrupt(new JobKey(jobName, "group1"));
        }
    }