web-dev-qa-db-ja.com

Quartzジョブを手動で起動する

アプリケーションには、いくつかのQuartzジョブが構成されています。開発中は、クォーツスケジューラをスタンバイのままにしますが、(開発目的で)手動でジョブを開始したい場合があります。 fireTriggerを呼び出すと、スケジューラーを開始する必要があることが通知されます。ただし、スケジューラーを開始すると、他のすべてのジョブもすぐにスケジュールされます。これは、私が望むものではありません(手動で起動されたジョブのデバッグ中にトリガーされる可能性があるため)。

スケジューラーを起動するとすべてのトリガーを一時停止できますが、その後、失火命令などに対処する必要があります。

一時停止や失火に対処することなく、手動でジョブを起動する簡単な方法はありますか(つまり、スケジューラーがスタンバイ状態の場合でも機能するfireTrigger)?

15
roger armstrong

これは、ジョブを手動で起動するために必要なループです。

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

  }
22
Gaurav Tailor

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);
_

注:

  • スケジューラーは、アプリケーション全体で使用されるスケジューラーインスタンスです。そのstart()メソッドは、作成後にすでに呼び出されている必要があります。
  • このジョブは、トリガーやcronをアタッチできない永続的なジョブです。プログラムで起動するには、triggerJob(JobKey jobKey)を呼び出す必要があります。
  • 3
    Minarul Haque

    start-timeおよびend-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>
    
    1
    user4706742

    スケジューラーにトリガーフィルターを追加してみてください

    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