2011-08-12 101 views
13

我們的應用程序中配置了幾個Quartz作業。在開發過程中,我們將石英調度程序置於待機狀態 - 但是,我們有時希望手動開始工作(用於開發目的)。如果我打電話給fireTrigger,它告訴我我需要啓動調度程序。但是,如果我啓動調度程序,它也會立即安排所有其他作業,這不是我想要的(因爲它們可能在我正在調試手動啓動的作業時觸發)。手動燒結石英作業

我可以暫停所有觸發,當我開始調度,但後來我不得不面對失火說明書等

有沒有一種簡單的方法來火了一個手動的工作,而不必應付暫停和擦槍走火(即即使調度器處於待機狀態也可以工作的FireTrigger)?

回答

0

你可以嘗試在你的調度程序添加一個觸發器過濾

this.scheduler.addGlobalTriggerListener(new DebugExecutionFilter()); 

調試執行濾色器將增加一票否決時執行是不揮發的(沒有計劃立即運行),你在調試模式。

下面是一個實現的例子:

private static class DebugExecutionFilter implements TriggerListener 
{ 

    public DebugExecutionFilter() 
    { 
    } 

    @Override 
    public String getName() 
    { 
     return "Task execution filter"; 
    } 

    @Override 
    public void triggerFired(Trigger trigger, JobExecutionContext context) 
    { 
     // Do nothing 
    } 

    /* (non-Javadoc) 
    * 
    * @see org.quartz.TriggerListener#vetoJobExecution(org.quartz.Trigger, org.quartz.JobExecutionContext) */ 
    @Override 
    @SuppressWarnings("unchecked") 
    /** 
    * A veto is added if : 
    * - For non volatile trigger if we are in debug mode 
    */ 
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) 
    { 

     try 
     { 
      // 
      if (!trigger.isVolatile() && isDebugMode()) 
      { 
       return true; 
      } 

      //task is run by scheduler.triggerJobWithVolatileTrigger() for immediate schedule 
      //or task is schedule and we are not in debugMode 
      return false; 
    } 


    @Override 
    public void triggerMisfired(Trigger trigger) 
    { 
     // do nothing 
    } 

    @Override 
    public void triggerComplete(Trigger trigger, JobExecutionContext context, int triggerInstructionCode) 
    { 
     // do nothing 
    } 

} 
+0

感謝您的回答mmounirou!也許我沒有完全描述這個問題,但我確實希望在開發模式下觸發非暫停觸發器。只是在開發模式下,調度程序處於待機狀態,所有觸發器默認都處於暫停狀態。如果我現在轉到我們的計劃作業頁面並啓動其中一個計劃程序,以便手動運行其中一個作業(每個作業旁邊,我們都有一個「立即運行」按鈕),所有其他作業都會失效。我基本上希望暫停的工作在開發模式下不採取任何措施 - 是否有全球的方式來做到這一點? –

16

這是你需要手動消防工作的循環:

scheduler = stdSchedulerFactory.getScheduler(); 
    //note: "stdSchedulerFactory" is the object created of 
    //the schedulerFactory(Standard) class. 


    // loop jobs by group 
    for (String groupName : scheduler.getJobGroupNames()) { 

    // get jobkey 
    for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher 
     .jobGroupEquals(groupName))) { 

     String jobName = jobKey.getName(); 
     String jobGroup = jobKey.getGroup(); 

     scheduler.triggerJob(jobName, jobGroup); 
    } 

    } 
+1

不要忘記標記爲這個答案適合你! –

+0

由於triggerJob()將JobKey作爲參數,因此不再適用於2.2.1。 [see doc](http://www.quartz-scheduler.org/api/2.2.1/org/quartz/Scheduler.html#triggerJob(org.quartz.JobKey)) 使用@ Minarul-Haque respsonse代替 –

0

無需start-timeend-time

<trigger> 
     <cron> 
     <name>TestTrigger</name> 
     <group>CronSampleTrigger</group> 
     <description>CronSampleTrigger</description> 
     <job-name>TestJob</job-name> 
     <job-group>jobGroup1</job-group>  

    <!--<start-time>1982-06-28T18:15:00.0Z</start-time> 
     <end-time>2020-05-04T18:13:51.0Z</end-time>--> 

     <cron-expression>0 0/1 * * * ?</cron-expression> 
     </cron> 
</trigger> 
2

在Quartz Scheduler中註冊的所有作業都由由名稱和組組成的JobKey唯一標識。您可以通過調用您的調度程序實例的triggerJob(JobKey jobKey)立即觸發具有給定JobKey的作業。

//Create a new Job 
    JobKey jobKey = JobKey.jobKey("myNewJob", "myJobGroup"); 
    JobDetail job =JobBuilder.newJob(MyJob.class).withIdentity(jobKey).storeDurably().build(); 

    //Register this job to the scheduler 
    scheduler.addJob(job, true); 

    //Immediately fire the Job MyJob.class 
    scheduler.triggerJob(jobKey); 

注:

  • 調度是在整個應用程序中使用Scheduler實例。它的start()方法應該在創建後調用。
  • 這項工作是一項持久的工作,不能附加任何觸發器或cron,只能通過調用triggerJob(JobKey jobKey)以編程方式觸發。