質問

春豆がいくつかあるとします:

<beans>
   <bean name="A" ... />
   <bean name="B" ... />
</beans>

&quot; B&quot; &quot; A&quot;を必要としないリモートサービスを公開します。 「A」がロードに無視できない時間がかかります。つまり、再起動サイクル中に、アプリケーションはリモートクライアントをハングさせます。リモートクライアントは実際にはサーバーに接続できますが、Springコンテナが完全に初期化されるまで応答を待ちます。

できることは、「B」を持っていることです。リモートアプリケーションは、(アプリケーションの状態に基づいて)NOT_READYなどを返すことしかできない場合でも、すぐに応答します。ただし、コンテナは、ロード順序に関係なくlazy-initとしてBeanを指定した場合でも、すべてのBeanが初期化されるまで強制的に待機します。

&quot; B&gt ;;すぐに利用できるということは、Springが部分的に初期化されたコンテナを利用可能にしなければならないことを意味します。ただし、初期化の順序についてだれかが得た情報や、妥当な回避策を見つけたかどうかを感謝します。

役に立ちましたか?

解決

Beanを参照しない&quot; A&quot;直接。代わりに、Bean「A」のFACTORYであるBeanを参照してください。このようにして、「A」をインスタンス化するための初期化ヒットを取得することなく、Factory Beanを作成できます。 &quot; A&quot;を参照するクラスをリファクタリングする必要があります。 &quot; A&quot;を取得するにはもちろん最初に。

または、Bean「A」を作成することができます。これは、初期化状態を持ち、Bean「A」のインターフェースを公開する、Bean「A」のコンテナです。呼び出し時に、初期化状態を未初期化に設定し、Bean「A」の初期化を開始します。いくつかのスレッドで。 「A」のインターフェースメソッドの呼び出し&quot; AA&quot;で次に、「A」の初期化まで、準備ができていない応答をブロックまたは返すことができます。 「AA」内完了しました。

これは、「ロードに無視できない時間を要する」という定義にかかっています。です。読み込みに無視できない時間がかかるのはなぜですか? Aで行われている特にトリッキーな初期化はありますか?または、Aが非常に巨大であるため、JVMが窒息しますか?

他のヒント

「Aの読み込みに無視できない時間」がかかる理由はわかりませんが、Aをリファクタリングすることで自分で遅延初期化することができます。InitializingBeanを使用したり、ApplicationEventを処理したりしないでください。処理する最初のリクエストで初期化するだけです。これにより、最初のリクエストが遅くなります!

他の可能性は、ApplicationEventを処理するBeanによって作成された分離されたスレッドに初期化を移動することです。スレッドは、Beanの初期化メソッドを非同期的に呼び出します。初期化されていないBeanへのリクエストの処理には注意してください!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top