アプリケーションには、いくつかのQuartzジョブが構成されています。開発中は、クォーツスケジューラをスタンバイのままにしますが、(開発目的で)手動でジョブを開始したい場合があります。 fireTriggerを呼び出すと、スケジューラーを開始する必要があることが通知されます。ただし、スケジューラーを開始すると、他のすべてのジョブもすぐにスケジュールされます。これは、私が望むものではありません(手動で起動されたジョブのデバッグ中にトリガーされる可能性があるため)。
スケジューラーを起動するとすべてのトリガーを一時停止できますが、その後、失火命令などに対処する必要があります。
一時停止や失火に対処することなく、手動でジョブを起動する簡単な方法はありますか(つまり、スケジューラーがスタンバイ状態の場合でも機能するfireTrigger)?
これは、ジョブを手動で起動するために必要なループです。
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);
}
}
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);
_
注:
triggerJob(JobKey jobKey)
を呼び出す必要があります。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>
スケジューラーにトリガーフィルターを追加してみてください
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
}
}