9

次のようにスケジューラを取得しています。

StdScheduler schedulerBean = (StdScheduler) ApplicationContextUtil.getBean(schedulerBeanName);
schedulerBean.start();

以降

schedulerBean.shutdown();

他のいくつかのコードを実行した後、再度 schedulerBean.start() を呼び出しています。

コードがエラーをスローするようになりました - 「org.quartz.SchedulerException: The Scheduler cannot be restarted after shutdown() has been called」

問題を解決する方法を教えてください。

前もってありがとう、カシール

4

2 に答える 2

9

スケジューラーをシャットダウンすると、スレッドやその他のリソースが完全に破壊されるため、スケジューラーを再起動することはできません。

ニーズに合った方法を見つけるために、QuartzSchedulerAPIリファレンスを読むことができます。以下にいくつかの利用可能な方法を示します。

  • standby()方法。スケジューラによるトリガーの起動を一時的に停止します。start()が呼び出されると(スケジューラーをスタンバイモードから解除するため)、start()メソッドの実行中にトリガー失火命令は適用されません-失火は直後に検出されます(JobStoreの通常のプロセスによって) 。
  • pauseJob(JobKey jobKey)- resumeJob(JobKey jobKey)。指定されたキーでJobDetailを一時停止します-現在のすべてのトリガーを一時停止します。resumeJob(JobKey jobKey)で、ジョブのトリガーのいずれかが1つ以上の起動時間を逃した場合、トリガーの失火命令が適用されます。
  • interrupt(JobKey jobKey)。このスケジューラインスタンス内で、識別されたジョブの現在実行中のすべてのインスタンスの中断を要求します。これは、InterruptableJobインターフェイスの実装者である必要があります。識別されたジョブの複数のインスタンスが現在実行されている場合、InterruptableJob#interrupt()メソッドが各インスタンスで呼び出されます。ただし、1つのインスタンスのinterrupt()が例外をスローした場合、残りのすべてのインスタンス(まだ割り込みされていない)ではinterrupt()メソッドが呼び出されないという制限があります。ジョブの特定のインスタンスに割り込む場合(複数のインスタンスが実行されている場合)、getCurrentlyExecutingJobs()を呼び出してジョブインスタンスへのハンドルを取得し、それに対して自分でinterrupt()を呼び出すことができます。このメソッドはクラスターを認識しません。あれは、
  • unscheduleJob(TriggerKey triggerKey)。示されたトリガーをスケジューラーから削除します。関連するジョブに他のトリガーがなく、ジョブが永続的でない場合、ジョブも削除されます。

次のように、ServletContextListenerインターフェースを実装するリスナーを作成できることに注意してください。

  • コンテナーがシャットダウンされると、すべてのジョブが中断され、スケジューラーがシャットダウンされます。
  • コンテナーが開始されると、スケジューラーが作成され、ジョブがスケジュールされます。

そのようなリスナーを作成したい場合は、詳細を提供できます。

これがお役に立てば幸いです。

于 2013-02-24T17:49:41.890 に答える
0

後でスケジューラオブジェクトを削除schedulerBean.Shutdown()し、最初に行ったようにスケジューラメソッドを再度呼び出します。

schedulerBean.Shutdown();    
   //do some work 
schedulerBean = null;
StdScheduler schedulerBean = (StdScheduler) ApplicationContextUtil.getBean(schedulerBeanName);
schedulerBean.Start();
于 2020-04-01T12:57:46.123 に答える