web-dev-qa-db-ja.com

現在実行中のクオーツジョブを中断または停止する方法は?

Java Quartz Jobsの助けを借りて実行されるいくつかのタスクがありますが、コード内のいくつかの条件によっていくつかのタスクを停止する必要があります。これは、InterruptableJobを介して実行できると読みました。しかし、私はどうすればいいかわからなかった?

19
breedish

InterruptableJob の実装としてジョブを記述する必要があります。このジョブを中断するには、 Scheduler へのハンドルが必要で、interrupt(jobKey<<job name & job group>>)を呼び出します

上記のクラスについては@ javadocをご覧ください。また、quartzディストリビューションにはこの例が含まれています(example7)。

34
blob

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());
    }
}
4
fl4l

私の意見では最良の解決策は、このスレッドで説明されているものです: 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();
}
1
melfore

なぜ誰もがこれを言及しなかったのか、または質問がなされたときにこれが利用できなかったのか、私にはわかりません。

スケジューラインスタンスには、シャットダウンと呼ばれるメソッドがあります。

 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は自明です。

それが役に立てば幸い。 :)

0
Nikhil Kumar

おそらくこれに答えるには少し遅れますが、それが役立つ可能性があります:

ジョブが不要になった場合は、次のコマンドを使用してその特定のジョブを削除できます

scheduler.deleteJob(jobKey(<JobKey>, <JobGroup>));

このメソッドは、他の多くのジョブが実行されている可能性があるスケジューラ内のジョブキーとグループによって一意に識別されるジョブのみを中断/停止します。

一方、スケジューラとその中のすべてのジョブを完全にシャットダウンしたい場合は、

scheduler.shutdown();

これ は、さまざまなジョブ関連タスクのかなり良い例です。

0
Swapnil B.