как пропустить время запуска cron

#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;
}