2011-08-12 10 views
13

私たちのアプリケーションではいくつかのQuartzジョブが設定されています。開発中は、クォーツスケジューラをスタンバイ状態にしておきますが、手動で(開発目的で)ジョブを開始することがあります。 fireTriggerを呼び出すと、スケジューラを起動する必要があることがわかります。しかし、私がスケジューラを起動すると、他のすべてのジョブも即座にスケジューリングされます(手動で起動したジョブをデバッグしている間に起動する可能性があるため)。手動でQuartzジョブを起動する

私は、スケジューラを起動したとき、私はすべてのトリガを一時停止することができ、その後私は、など失火命令で

を対処する必要が一時停止し、失火(に対処することなく、ジョブを手動でオフに発射する簡単な方法はありますつまり、スケジューラがスタンバイ状態であっても動作する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

回答ありがとうございました!たぶん私は問題を正確には説明していないかもしれませんが、実際には非一時停止トリガを開発モードで起動する必要があります。開発モードでは、スケジューラはスタンバイ状態のままで、すべてのトリガはデフォルトで一時停止されます。スケジュールされたジョブページに移動してスケジューラの1つを手動で起動すると(各ジョブの横に「今すぐ実行」ボタンがあります)、他のすべてのジョブが失敗します。私は基本的に、開発モードで失業していない仕事を何もしないことを望んでいます - これを行うグローバルな方法がありますか? –

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ではこれ以上は機能しません。 [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によって一意に識別されます。 Schedulerインスタンスの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を付加できない耐久性のあるジョブです.を呼び出すことによってのみプログラムで起動できます。