#quartz-scheduler
#quartz-планировщик
Вопрос:
Я переношу файлы из каталога на удаленном хосте, и триггер запускает задания, когда для этого задания наступает интервал.Но я хочу быть уверен, что если задание все еще работает в хранилище (загрузка файлов еще не завершена), когда наступит время запуска, quartz пропустит этот интервал.Я пытаюсь использовать этот c r on_trigger.MISFIRE_INSTRUCTION_DO_NOTHING но мне кажется, это только в том случае, если для задания нет доступного потока.
public CronTrigger scheduleJob(RemoteJob job, String cronExpression,Date firstFireTime) throws SchedulerException, ParseException {
JobDetail jobDetail = new JobDetail(job.getDescription(), job.getName(), job.getClass());
CronTrigger crTrigger = new CronTrigger(
"cronTrigger", job.getName(), cronExpression);
scheduler.scheduleJob(jobDetail, crTrigger);
crTrigger.setStartTime(firstFireTime);
crTrigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
return crTrigger;
}
Ответ №1:
Создайте TriggerListener, который отслеживает, выполняется ли одно из ваших заданий загрузки, а затем возвращает true для наложения вето на выполнение заданий другого типа.
Ответ №2:
Я немного изменил приведенный выше код, он сработал.
/**
* not for cluster
*/
@Override
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
try {
List<JobExecutionContext> currentlyExecutingJobs = context.getScheduler().getCurrentlyExecutingJobs();
for (JobExecutionContext jobContext : currentlyExecutingJobs) {
if (jobContext.getTrigger().equals(trigger) amp;amp;
jobContext.getJobDetail().getKey().equals(trigger.getJobKey())) {
return true;
}
}
} catch (SchedulerException ex) {
return true;
}
return false;
}
Ответ №3:
Я сделал, как вы сказали
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
try {
List<JobExecutionContext> jobs =
context.getScheduler().getCurrentlyExecutingJobs();
for (JobExecutionContext job : jobs) {
if (job.getTrigger().equals(context.getTrigger()) amp;amp;
!job.getJobInstance().equals(this)) {
_logger.info("There's another instance running,So job discarded " context.getJobDetail().getGroup() ":" context.getJobDetail().getName());
return true;
}
}
} catch (SchedulerException ex) {
return true;
}
return false;
}