【问题标题】:how to skip cron trigger firetime如何跳过 cron 触发触发时间
【发布时间】:2018-10-09 14:38:11
【问题描述】:

我正在从远程主机上的目录传输文件,并且触发器会在此作业的间隔到达时触发作业。但我想确定当触发器时作业仍在存储上工作(文件下载尚未完成)开火时间到了,石英会跳过这个间隔。我试着用这个 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;

}

【问题讨论】:

    标签: quartz-scheduler


    【解决方案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) &&
                          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()) && 
        !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;
        }
        

        【讨论】:

          猜你喜欢
          • 2011-09-02
          • 1970-01-01
          • 1970-01-01
          • 2010-11-04
          • 2012-04-25
          • 1970-01-01
          • 2018-08-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多