jakarta ee Java Quartz计划作业不允许并发执行作业
我使用Quartz作业执行特定任务
我还在我的主应用程序类中安排它的执行,我试图完成的是不允许同时执行此作业的实例
因此,调度器只应在其上一个实例完成时执行作业
这是我的职业课:
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 .... <<<<<<<<<<<<<<<<<<<<");
}
}
因此,在我的应用程序的主类中,我将启动调度程序:
...
//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实例
# 1 楼答案
^}可以完成您的工作,但请考虑它只会阻止您的类在同一节点上运行两次。
请参阅Quartz 2.2 multi scheduler and @DisallowConcurrentExecution中的@ReneM comment
# 2 楼答案
您可以实现StatefulJob或注释DisallowConcurrentExecution
# 3 楼答案
当使用
@DisallowConcurrentExecution
方法从作业执行时,请谨慎使用@Async
第二个线程可能与第一个线程冲突
# 4 楼答案
只需在Job类的顶部使用
@DisallowConcurrentExecution
注释有关并发作业执行,请参阅此官方example或此tutorial