Java Quartz Jobs の助けを借りて実行されるいくつかのタスクがありますが、コード内のいくつかの条件によっていくつかのタスクを停止する必要があります。これは InterruptableJob を介して実行できることを読みました。しかし、私はそれをどのように行うべきかを理解していませんでしたか?
6 に答える
InterruptableJobの実装としてジョブを作成する必要があります。このジョブを中断するには、 Scheduler へのハンドルが必要です。interrupt(jobKey<<job name & job group>>)
上記のクラスについては、@ javadoc を参照してください。また、Quartz ディストリビューションには、この例が含まれています (example7)。
私の意見では、最善の解決策は、このスレッドで説明されているものです: 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();
}
誰もこれについて言及しなかった理由がわかりません。または、質問が行われた時点でこれが入手できなかったのかもしれません。
Scheduler インスタンスには shutdown というメソッドがあります。
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 は一目瞭然です。
それが役に立てば幸い。:)
実行中のすべてのジョブを中断するには
for (JobExecutionContext currentlyExecutingJob : scheduler.getCurrentlyExecutingJobs()) {
if (InterruptableJob.class.isAssignableFrom(currentlyExecutingJob.getJobDetail().getJobClass())) // Otherwise it will throw an exception
scheduler.interrupt(currentlyExecutingJob.getFireInstanceId());
}
でジョブ情報をJobExecutionContext
取得したり、Job クラスを取得したりできます。