2

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

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

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

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

「B」がすぐに利用可能になるということは、Springが部分的に初期化されたコンテナを利用可能にする必要があることを意味するのではないかと思います。ただし、初期化の順序に関する情報と、適切な回避策が見つかったかどうかを確認していただければ幸いです。

4

2 に答える 2

4

Don't refer to bean "A" directly. Instead, refer to a bean which is a FACTORY for bean "A"; in this way, the Factory bean can be created without taking the initialization hit for instantiating "A". You'll need to refactor your classes which refer to an "A" to retrieve an "A" first, of course.

Or, you could create a bean "AA", which is a container for bean "A", which has an initialization state, and which exposes the interface of bean "A"; upon invocation, it sets its initialization state to not initialized, and begins initialization of bean "A" in some thread; calls to any interface methods of "A" on "AA" can then either block or return a not ready response, until the initialization of "A" within "AA" has completed.

This all kinda hinges on what your definition of "takes a non-negligible time to load" is. Why does it take a non-negligible amount of time to load? Is there some particularly tricky initialization that's going on within A? Or is A just so monstrously huge that it chokes the JVM?

于 2008-10-16T20:24:23.110 に答える
0

「Aのロードに無視できない時間がかかる」理由がわかりませんが、Aをリファクタリングして自分自身を怠惰に初期化できるかもしれません.InitializingBeanを使用したり、ApplicationEventを処理したりしないでください。処理する最初のリクエストで初期化するだけです。これにより、最初のリクエストが遅くなります。

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

于 2008-10-14T19:56:40.610 に答える