4

毎日07:00に実行する必要があるメソッドがあります。さらに言えば、メソッドを使用して Bean を作成し、注釈を付けました@Scheduled(cron="0 0 7 * * ?")。この Bean で、次のように、Springmainコンテキストを初期化し、Bean を取得し、メソッドを呼び出します (少なくとも初めて) 関数を作成しました。

public static void main(String[] args) {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(args[0]);
    SchedulerService schedulerService = context.getBean(SchedulerService.class);
    schedulerService.myMethod();
}

これは問題なく動作しますが、一度だけです。私はその理由を理解していると思います-それはmainスレッドが終了するためです-そして春のコンテキストもそうであるため、myMethod注釈が付けられていても機能しません@Scheduled

main私はこれを渡す方法を考えました-つまり、おそらく次のように、スレッドを死なせないでください:

while (true){
   Thread.currentThread().sleep(500);
}

それが、アプリケーションコンテキストが残り、私のBeanもそうであると私が思う方法です。

私は正しいですか?

これを解決するより良い方法はありますか?

春の 3.1.2 を使用しています。

ありがとう。

4

2 に答える 2

4

メイン スレッドは、非デーモン スレッドがアクティブになるまでアクティブなままにする必要があります。アプリケーションにタグがある場合<task:annotation-driven/>、Spring は非デーモン スレッドの小さなプールを使用してエグゼキュータを起動し、メイン アプリケーションは終了しません。

必要な唯一のことは、シャットダウン フックを登録して、VM の終了時に確実にクリーンアップすることです。

context.registerShutdownHook()

于 2012-08-29T20:00:40.277 に答える
1

join メソッドはこれに最適です。

    try {
        Thread.currentThread().join();
    } catch (InterruptedException e) {
        logger.warn("Interrupted", e);
    }

または、古い学校の待機方法を次に示します。

    final Object sync = new Object();
    synchronized (sync) {
        try {
            sync.wait();
        } catch (InterruptedException e) {
            logger.warn("Interrupted", e);
        }
    }
于 2012-08-29T21:08:53.143 に答える