2017-02-28 2 views
2

Springクラウドアプリケーションの注釈付きSpring Beanが2回作成されています。これは、ブートストラップ・コンテキストと子アプリケーション・コンテキストに組み立てられているためと考えています。SpringクラウドのブートストラップコンテキストでBeanが構築されないようにする

私にとっては、バックエンドデータソースから提供されるデータの定期的な更新を実行するために@Scheduledという注釈が付けられているものがあり、これが文脈ごとに1回ずつ連続して2回起こっているため、これは望ましくありません。

それ以外の場合は、アプリケーションビーンズをすべてブートストラップコンテキストで作成しないようにすることはできますか?そうでなければ、ブートストラップコンテキストで実行しているときにコードで検出できますか? Camden SR4リリースでコンポーネントスキャンを有効にしたアノテーションベースのBeanをすべて使用しています。

+0

Spring Cloudはコンポーネントスキャンやブートストラップの何も実行しません。彼らがそこに作られているなら、あなたはそれを自分でやったのです。サンプルが便利です。 –

+0

@DaveSyerさらに調査しました。このサービスは、プロキシ機能を実行する別のサーブレットを追加します。プロキシサーブレット自体はBeanですが、それを登録するServletRegistrationBeanがあります。 2番目のコンテキストは、新しいサーブレットで作成されたようです。私は春のブートで作成されたルートのWebApplicationContextを共有するために作成できるか調べています。 –

答えて

0

OK私はこれを自分で解決しました。コードでは2つの異なる問題があり、複数のコンテキストとは関係ありませんでした。

最初に@PostConstructメソッドが一度しか呼び出されないという私の長い間の仮定は間違っていました。 1回限りのBeanの初期化コードをApplicationListener<ApplicationReadyEvent>の実装に移すと、それが解決されました。

第2に、@Scheduledアノテーションを使用してBeanを複数初期化してビットを取得すると、スケジューラが複数回実行されます。公正であるために、この動作はdocumentationに記載されています。これは、スケジュールされたタスクの作成をApplicationReadyEventの実装で設定された通常のJava ScheduledExecutorServiceに移動することで簡単に解決されました。

関連する問題