2016-08-10 10 views
1

私のアプリケーションはスプリングブートに基づいています。 アプリケーションの起動後に一度だけ実行されるタスクを作成したいと思います。Spring、アプリケーション起動時にタスクを1回実行する

現在、私は2つのソリューションに探しています:

  1. は、ロジックを実行するか、しないかをSHOLDかどうかを判断してください@Scheduledとboolean型プロパティを使用します。 Quartzを使用して

    @Scheduled public void method(){ if(method_run_propery){ //do something; } }

  2. 。しかし、私は以前使用していません。

この場合、どのような方法を使用するのが最適かを教えてください。

+0

https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2を参照してください - 私は1回の実行のためにスケジューリングする必要はありませんタスク – shachar

+0

@shachar。アプリケーションが開始された後、私はインメモリのデータグリッドにデータがあるかどうかチェックしています。空の場合は、データを取得して保存します。だから、私はそれを一度しかやりたくないのです。 –

答えて

4

の直後にを一度だけ実行する必要がある場合は、シングルトンBeanのinitメソッドから開始するだけです。 Springはすべての依存するBeanが初期化された時点で実行されることを保証します。例えば

は、あなたのようなもの使用することができたJavaアノテーションSpring構成と仮定すると:コンテキストが更新されると

@Bean(init_method="init") 
class TaskLauncher { 

    @Autowired DependantBeanClass dependant Bean; 
    ... 

    public void init() { 
     // execute or start the task, eventually using the autowired dependant beans 
     ... 
    } 
} 

を、春には、すべてをautowire依存豆を初期化し、その後のinit方法一度呼び出します。 bean。TaskLauncher bean。

@Schedulerもクォーツの必要はありません。あなたが唯一

+0

あなたのアプローチをより詳細に記述してください。 –

5

春春の初期化時に何かを開始する必要がある場合には、まさにそれを行うには@PostConstruct注釈を持っています。 Beanが初期化され、すべての依存関係が追加されると実行されます。

+0

post構造で別のAPIにリクエストを実行するのは良いアプローチですか? –

+0

アプリケーションの起動に必要なものによって異なります。アプリケーションの起動を確定する前にキャッシュを水和させるために他のAPIからのデータが必要な場合は、どうやって回避するのかわかりません。一回限りのリクエストの場合は、何らかの非ブロッキング呼び出しを行い、@PostConstructメソッドが返ってアプリケーションの起動を完了できるようにすることができます。 –

+0

私はあなたにアプローチしようとします。そして結果を出す –

関連する問題