Java Quartz scheduled Job - 禁止并发执行 Job
Java Quartz scheduled Job - disallow concurrent execution of Job
我正在使用 Quartz Job 来执行特定任务。
我也在我的主应用程序中安排它的执行 class 我想要完成的是不允许同时执行此作业的实例。
因此调度程序应该只在其前一个实例完成后才执行该作业。
这是我的工作class:
public class MainJob implements Job {
static Logger log = Logger.getLogger(MainJob.class.getName());
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
GlobalConfig cfg = new GlobalConfig();
ProcessDicomFiles processDicomFiles = new ProcessDicomFiles();
ProcessPdfReportFiles processPdf = new ProcessPdfReportFiles();
try {
log.info("1. ---- SCHEDULED JOB -- setStudiesReadyToProcess");
processDicomFiles.setStudiesReadyToProcess();
log.info("2. ---- SCHEDULED JOB --- distributeToStudies");
processDicomFiles.distributeToStudies(cfg.getAssocDir());
...
//process any incoming PDF file
log.info("11. ---- SCHEDULED JOB --- processPdfFolder");
processPdf.processPdfFolder();
} catch (Exception ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.ERROR, null, ex);
}
log.info(">>>>>>>>>>> Scheduled Job has ended .... <<<<<<<<<<<<<<<<<<<<");
}
}
所以在我的应用程序的主要 class 中,我正在启动调度程序:
...
//start Scheduler
try {
startScheduler();
} catch (SchedulerException ex) {
log.log(Level.INFO, null, ex);
}
...
public void startScheduler () throws SchedulerException {
//Creating scheduler factory and scheduler
factory = new StdSchedulerFactory();
scheduler = factory.getScheduler();
schedulerTimeWindow = config.getSchedulerTimeWindow();
JobDetailImpl jobDetail = new JobDetailImpl();
jobDetail.setName("First Job");
jobDetail.setJobClass(MainJob.class);
SimpleTriggerImpl simpleTrigger = new SimpleTriggerImpl();
simpleTrigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
simpleTrigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
simpleTrigger.setRepeatInterval(schedulerTimeWindow);
simpleTrigger.setName("FirstTrigger");
//Start scheduler
scheduler.start();
scheduler.scheduleJob(jobDetail,simpleTrigger);
}
如果另一个 MainJob 实例仍在运行,我想阻止调度程序启动第二个 MainJob 实例 运行 ...
只需在作业 class 之上使用 @DisallowConcurrentExecution
注释。
你可以实施StatefulJob or annotate DisallowConcurrentExecution
@DisallowConcurrentExecution
可以完成您的工作,但请考虑这只会阻止您的 class 在同一节点上被 运行 两次。
请在
中查看@ReneM评论
使用 @DisallowConcurrentExecution
方法和 @Async
从 Job 执行时要小心
第二个线程可能与第一个
冲突
我正在使用 Quartz Job 来执行特定任务。
我也在我的主应用程序中安排它的执行 class 我想要完成的是不允许同时执行此作业的实例。
因此调度程序应该只在其前一个实例完成后才执行该作业。
这是我的工作class:
public class MainJob implements Job {
static Logger log = Logger.getLogger(MainJob.class.getName());
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
GlobalConfig cfg = new GlobalConfig();
ProcessDicomFiles processDicomFiles = new ProcessDicomFiles();
ProcessPdfReportFiles processPdf = new ProcessPdfReportFiles();
try {
log.info("1. ---- SCHEDULED JOB -- setStudiesReadyToProcess");
processDicomFiles.setStudiesReadyToProcess();
log.info("2. ---- SCHEDULED JOB --- distributeToStudies");
processDicomFiles.distributeToStudies(cfg.getAssocDir());
...
//process any incoming PDF file
log.info("11. ---- SCHEDULED JOB --- processPdfFolder");
processPdf.processPdfFolder();
} catch (Exception ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.ERROR, null, ex);
}
log.info(">>>>>>>>>>> Scheduled Job has ended .... <<<<<<<<<<<<<<<<<<<<");
}
}
所以在我的应用程序的主要 class 中,我正在启动调度程序:
...
//start Scheduler
try {
startScheduler();
} catch (SchedulerException ex) {
log.log(Level.INFO, null, ex);
}
...
public void startScheduler () throws SchedulerException {
//Creating scheduler factory and scheduler
factory = new StdSchedulerFactory();
scheduler = factory.getScheduler();
schedulerTimeWindow = config.getSchedulerTimeWindow();
JobDetailImpl jobDetail = new JobDetailImpl();
jobDetail.setName("First Job");
jobDetail.setJobClass(MainJob.class);
SimpleTriggerImpl simpleTrigger = new SimpleTriggerImpl();
simpleTrigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
simpleTrigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
simpleTrigger.setRepeatInterval(schedulerTimeWindow);
simpleTrigger.setName("FirstTrigger");
//Start scheduler
scheduler.start();
scheduler.scheduleJob(jobDetail,simpleTrigger);
}
如果另一个 MainJob 实例仍在运行,我想阻止调度程序启动第二个 MainJob 实例 运行 ...
只需在作业 class 之上使用 @DisallowConcurrentExecution
注释。
你可以实施StatefulJob or annotate DisallowConcurrentExecution
@DisallowConcurrentExecution
可以完成您的工作,但请考虑这只会阻止您的 class 在同一节点上被 运行 两次。
请在
使用 @DisallowConcurrentExecution
方法和 @Async
第二个线程可能与第一个
冲突