Quartz触发相同的实例两次

时间:2015-06-25 13:02:08

标签: java quartz-scheduler

我们在Java类中使用DisallowConcurrentExecutionAttribute注释来防止多个实例的并发执行,但是,看起来Quartz已经同时触发了两次相同的实例。如果是错误,请解决此问题并向我们提供更多信息并解决此问题。

@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void execute(final JobExecutionContext jobExecutionContext) throws JobExecutionException {
    logger.log(Log.DEBUG, "++++ Quartz JOB BatchJobDetector started");
    try {
        this.setJobExecutionContext(jobExecutionContext);
        boolean triggerNextJob = true;
        while (triggerNextJob) {
            TriggeredBatchProcessDTO triggeredBatchProcessDTO = getNextJob(jobExecutionContext, 0);
            if (triggeredBatchProcessDTO != null) {

                triggerJobImmediatly(triggeredBatchProcessDTO.getId(), jobExecutionContext);
                triggeredBatchProcessDTO.setState(StatusType.RUNNING);  
                triggeredBatchProcessDTO.setProcessDtTm(triggeredBatchProcessDTO.getProcessDtTm());//CRGRO022
                updateTriggeredBatchProcessDTO(triggeredBatchProcessDTO);

            } else {
                triggerNextJob = false;
            }
        }
    } catch (final UnexpectedRuntimeException e) {
        logger.log(Log.ERROR, "Error during execution of TriggeredBatchProcessDetectorJob: " + e.getMessage(), e);
        throw e;
    } catch (final Throwable t) {
        throw new UnexpectedRuntimeException(CoreExceptionId.RUN_0001_UNEXPECTED_EXCEPTION,
            new Object[] { "TriggeredBatchProcessDetectorJob error" }, t);
    }
    logger.log(Log.DEBUG, "++++ Quartz JOB BatchDetector finished");
}

1 个答案:

答案 0 :(得分:0)

您需要通过属性正确设置石英以将其运行到群集模式,并且我不确定但是您还应该使用@PersistJobDataAfterExecution注释。我使用聚集石英没有任何问题,也有使用depracated工作实现 StatefulJob。您需要向我们展示您的配置 - here is sample - 并提供quartz lib版本