2

一部の Java WAR で Quartz Scheduler (v2.2.1) を使用していますが、データベース エラーからの回復中に問題が発生しています。WAR は JBOSS AS 7.1 にデプロイされます。

WAR の初期化で、2 つのスケジューラーを開始します。最初のスケジューラーはクラスター化された JobStoreTX で構成され( WARはクラスターにデプロイされます)、2 つ目はサーバー固有の設定を監視するためにRAMJobStoreで構成されます。

RAM スケジューラには、 MySQLデータベースからテーブルを監視するジョブも含まれています。エラーが発生した場合、Quartz ジョブを起動し続けることが望ましいですが、実際には、スケジューラがフリーズしてこれらのジョブが起動されないことがあります。

たとえば、テストで次の方法を使用しましたが、スケジューラを再インスタンス化することはできませんでした。

/**
 * Resets all scheduled jobs.
 */
public void reset(final long currentTime) {

    try {
        final StdSchedulerFactory schedFactory = new StdSchedulerFactory();
        schedFactory.initialize("quartz.properties");
        Scheduler myScheduler = schedFactory.getScheduler();

        if (myScheduler != null) {                
            myScheduler.clear();                
            myScheduler.shutdown(); --> HERE, THE THREAD IS LOCKED !!!                
            myScheduler = null;
        }

        myScheduler = schedFactory.getScheduler();
        loadJobs(myScheduler);
        myScheduler.start();
        //myScheduler.startDelayed(10);                        

    } catch (SchedulerException e) {
        LOG.error("Scheduler error !!!");
    }
}

Quartz Scheduler を再起動する適切な方法はどれですか?

前もって感謝します

更新 1

Scheduler オブジェクトは同じように見えるため、shutdown を呼び出す前に StdSchedulerFactory と Scheduler を再インスタンス化する方法を変更しましたが、うまくいきませんでした。

機能的な例を教えてください。

ありがとう

4

2 に答える 2

0

スケジューラがフリーズしたということは、API に大きなバグがあることを意味します。言及しているケースでスローされたスタック トレースまたはエラーを提供してください。

私の経験に基づいて、返されるスケジューラーオブジェクトは、呼び出した回数と同じになります

schedFactory.getScheduler();

古いジョブをクリーンアップしたり、逆参照したり、停止したりする必要がある場合があります。

正しい手順は

-1- スケジューラ オブジェクトをフェッチする

-2- scheduler.shutdown(); を呼び出してスケジューラを停止します。

-3- ジョブを再度ロードし、スケジューラを開始します

于 2013-11-12T00:27:01.077 に答える