2011-07-06 9 views
4

私は、そのコンストラクタでhttpを介して外部システムにアクセスするSpring Beanを持っています。 外部システムを起動時に使用できない場合は、Beanを作成できず、アプリケーションが正常に起動しません。Springで弾力のあるBeanを実装する方法は?

エクステンションシステムに関係なく私のアプリケーションを起動できるようにしたい。アプリケーションを再起動する必要があるのではなく、しばらくの間機能が不足していると思います。

私はこれがSpringのスコープとプロキシビーンファクトリの適切な選択で達成可能であるべきだと知っていますが、どのように実際にそれを行うのかは分かりません。 Spring AOPのほとんどの部分は、作成中にエフェクトを処理できない、または間違っているターゲットを変更することを目的としていますか?

要するに、最初のアクセス時にターゲットBeanを作成し、それが機能する限りそのインスタンスを保持するプロキシが必要です。作成に失敗した場合は、例外がスローされ、次にプロキシが呼び出されるまで再試行する必要があります。

この機能はどのように実装しますか?

+1

私は、春は本当にあなたのために多くの助けになるとは思わないでしょう。シンプルな例外処理と状態制御を使用して、復元力を自分で実装する方が簡単です。 – skaffman

答えて

1

実際の作成を後で延期するResilientBeanProxyを作成してしまったので、ほとんどの場合、Springの遅いinitと同じですが、initの間に例外を処理する機能が追加されています。例えば起動時にエラーが発生するアプリケーションコンテキストの作成を停止しません。

作成に失敗した場合は、次回の呼び出し時に再試行されます。

+0

Gitハブでそのコードを共有する可能性はありますか? –

+0

歴史の霧の中でコードが長く失われていると申し訳なく思っています。 –

1

遅延開始を試しましたか?

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/> 

このBeanを起動時に起動するため、このBeanをSingleton Beanのプロパティとして設定しないでください。

+0

コンポーネントが他のシングルトンで使用されているため、遅延が発生しません。起動時に作成されるため、起動時に作成されます –

0

あなたのbeanが実際に構築時にリモートリソースに依存するかどうかを検討しますか?たぶん遅延初期化をここで使用できますか?コンストラクタでこの外部システムを呼び出すことはできませんが、リモートリソースが必要な場合は、最初にこのメソッドを呼び出します。リソースが存在しない場合より、ResourceUnavailableExceptionの種類のメッセージに'Try again later'が含まれています。

+0

後で延期すると、場所の上に。 –

関連する問題