これを実装する方法を見つけました。このソリューションでは、すべての依存サービスのインスタンスを再作成するのはブループリントではありません。こんなふうになります:
- 接続「ウォッチドッグ」Bean。
「ChatProtocolClient」Bean を作成する代わりに、xml から ConnectionWatchDog Bean を作成しました。これらの Bean では、BundleContext が注入され、接続プロパティが .xml ファイルから設定されます。次に、ConnectionWatchDog は ChatProtocolClient インスタンスの作成/接続を試みます。接続が成功すると、BundleContext にサービスを登録します (bundleContext.registerService(..) を使用)。ServiceRegistration はウォッチドッグに保持されます。ウォッチドッグは、設定された間隔で接続をテストします (独自のスレッドを実行します)。接続が失敗したように見える場合。ウォッチドッグは serviceRegistration.unregister() を呼び出し、残りのクライアント接続インスタンスをクリーンアップし、新しい ChatProtocolClient インスタンスの作成、接続、および登録のプロセス全体を開始します。
- チャットチャンネル
ChatChannel はブループリントで . xml は次のようになります。
<blueprint xmlns=...>
<reference-list id="chat-connection" member-type="service-object" interface="com.example.ChatProtocolClientInterface">
<reference-listener bind-method="onBind" unbind-method="onUnbind" ref="Channel1"/>
</reference-list>
<bean id="Channel1" class="ChatChannel" init-method="startUp">
<property name="chatProtocolClient" ref="chat-connection">
... some other properties ...
</bean>
</blueprint>
service-object に設定された member-type は、サービスが登録または登録解除されると、ChatChannel が「onBind」および「onUnbind」メソッドで通知されることを意味します。パラメータとして、ChatProtocolClientInterface インスタンスを取得します。
これが唯一の解決策か最善の解決策かはわかりませんが、私にとってはうまくいきます。この xml の例では、「chatProtocolClient」のセッターも必要になることに注意してください。現在、ブループリントで設定されたリストは使用せず、onBind メソッドと onUnbind メソッドのみを使用しています。