Java Quartz Jobsの助けを借りて実行されるいくつかのタスクがありますが、コード内のいくつかの条件によっていくつかのタスクを停止する必要があります。これは、InterruptableJobを介して実行できると読みました。しかし、私はどうすればいいかわからなかった?
InterruptableJob の実装としてジョブを記述する必要があります。このジョブを中断するには、 Scheduler へのハンドルが必要で、interrupt(jobKey<<job name & job group>>)
を呼び出します
上記のクラスについては@ javadocをご覧ください。また、quartzディストリビューションにはこの例が含まれています(example7)。
Springを備えたQuartz 2.1では、次のことができます。
@Autowired
private Scheduler schedulerFactoryBean; //injected by spring
...
...
List<JobExecutionContext> currentlyExecuting = schedulerFactoryBean.getCurrentlyExecutingJobs();
//verifying if job is running
for (JobExecutionContext jobExecutionContext : currentlyExecuting) {
if(jobExecutionContext.getJobDetail().getKey().getName().equals("JobKeyNameToInterrupt")){
result = schedulerFactoryBean.interrupt(jobExecutionContext.getJobDetail().getKey());
}
}
私の意見では最良の解決策は、このスレッドで説明されているものです: http://forums.terracotta.org/forums/posts/list/7700.page
ジョブをきれいに終了させるために、停止フラグをtrueに設定した後に「スリープ」を導入しました。
@Override
public void interrupt() throws UnableToInterruptJobException {
stopFlag.set(true);
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
//logger.error("interrupt()", e);
}
Thread thread = runningThread.getAndSet(null);
if (thread != null)
thread.interrupt();
}
なぜ誰もがこれを言及しなかったのか、または質問がなされたときにこれが利用できなかったのか、私にはわかりません。
スケジューラインスタンスには、シャットダウンと呼ばれるメソッドがあります。
SchedulerFactory factory = new StdSchedulerFactor();
Scheduler scheduler = factory.getScheduler();
上記は、次のようなジョブを開始するために使用されます
scheduler.start();
フラグなどを使用して、ジョブの実行をいつ停止するかを確認します。次に使用します
scheduler.shutdown();
要件をどのように実装したか:
if(flag==true)
{
scheduler.start();
scheduler.scheduleJob(jobDetail, simpleTrigger);
}
else if(flag==false)
{
scheduler.shutdown();
}
ここで、jobDetailおよびsimpleTriggerは自明です。
それが役に立てば幸い。 :)
おそらくこれに答えるには少し遅れますが、それが役立つ可能性があります:
ジョブが不要になった場合は、次のコマンドを使用してその特定のジョブを削除できます
scheduler.deleteJob(jobKey(<JobKey>, <JobGroup>));
このメソッドは、他の多くのジョブが実行されている可能性があるスケジューラ内のジョブキーとグループによって一意に識別されるジョブのみを中断/停止します。
一方、スケジューラとその中のすべてのジョブを完全にシャットダウンしたい場合は、
scheduler.shutdown();
これ は、さまざまなジョブ関連タスクのかなり良い例です。