2

からQuartz2.0.1スケジューラーを使用していStdSchedulerFactoryます。

私はSchedulerException自分のコードを捕らえています。

finallyブロックでスケジューラーをシャットダウンする必要があります:

} finally {
    scheduler.shutdown();
}

または、tryブロックでシャットダウンを実行する必要がありますか?

シャットダウンメソッドはスローする可能性がSchedulerExceptionあるため、シャットダウンをfinallyブロックに含めるべきではないようです。

4

2 に答える 2

0

上記の回答を参考にすると、起動/シャットダウン以外のコードがある場合でも問題が発生する可能性があります。たとえば、次のようなものがあるとします。

public class QuartzTest {
    public static void main(String[] args) {

        try {
            // Grab the Scheduler instance from the Factory 
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            // and start it off
            scheduler.start();
            System.out.println(args[5]);
            scheduler.shutdown();

        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

ArrayIndexOutOfBoundsException (またはそのようなもの) が発生するため、アプリケーションがシャットダウンを呼び出すことはありません。これを解決する方法はいくつかありますが、最も簡単な方法は、すべての中間コードを例外ハンドラーでラップし、そこで「処理」することです。例: public class QuartzTest {

public static void main(String[] args) {

    try {
        // Grab the Scheduler instance from the Factory 
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        // and start it off
        scheduler.start();
        try {
             System.out.println(args[5]);
        } catch (Exception e) {
             e.printStackTrace();
        }
        scheduler.shutdown();

    } catch (SchedulerException se) {
        se.printStackTrace();
    }
}

}

于 2012-02-22T13:42:14.557 に答える
0

スケジューラーが正常に開始された場合、SchedulerExceptionそれはスローされないため、最終ブロックでそれを行う必要はありSchedulerExceptionません。そのため、開始されていないスケジューラーをシャットダウンしないでください。

これは、プロジェクトのホームページからのサンプル プログラムです。

public class QuartzTest {

    public static void main(String[] args) {

        try {
            // Grab the Scheduler instance from the Factory 
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            // and start it off
            scheduler.start();

            scheduler.shutdown();

        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

また、上記のリンクから、

StdSchedulerFactory.getDefaultScheduler() を使用してスケジューラを取得すると、アクティブなスレッドが存在するため、アプリケーションは scheduler.shutdown() を呼び出すまで終了しません。

于 2012-02-22T13:30:33.710 に答える