1

私のアプリケーションには Service ChatProtocolClient があります。実装は、ブループリントの「init-method」でリモート サーバーに接続し、「destroy-method」で切断する tcp クライアントです。

この ChatProtocolClient の接続を使用して、チャネル ChatChannel からメッセージを読み書きする別のバンドルもあります。現在、ChatProtocolClient の Bean を作成し、作成された ChatProtocolClient サービスへの参照が注入される Bean ChatChannel を作成する xml ファイルがあります。

しかし、サーバーからの切断をどのように処理できますか? ブループリント フレームワークに、私の ChatProtocolClient インスタンスが現在使用できず、このインスタンスを登録解除する必要があることを伝えたいと思います。

できれば、Blueprint はすべての依存 Bean (Blueprint がこのサービス参照を注入した Bean) で destroy-method を自動的に呼び出し、新しい ChatProtocolClient Bean と依存関係が失敗したために破棄されたすべての Bean を初期化します。

これはどのように行うことができますか?

4

1 に答える 1

0

これを実装する方法を見つけました。このソリューションでは、すべての依存サービスのインスタンスを再作成するのはブループリントではありません。こんなふうになります:

  1. 接続「ウォッチドッグ」Bean。

「ChatProtocolClient」Bean を作成する代わりに、xml から ConnectionWatchDog Bean を作成しました。これらの Bean では、BundleContext が注入され、接続プロパティが .xml ファイルから設定されます。次に、ConnectionWatchDog は ChatProtocolClient インスタンスの作成/接続を試みます。接続が成功すると、BundleContext にサービスを登録します (bundleContext.registerService(..) を使用)。ServiceRegistration はウォッチドッグに保持されます。ウォッチドッグは、設定された間隔で接続をテストします (独自のスレッドを実行します)。接続が失敗したように見える場合。ウォッチドッグは serviceRegistration.unregister() を呼び出し、残りのクライアント接続インスタンスをクリーンアップし、新しい ChatProtocolClient インスタンスの作成、接続、および登録のプロセス全体を開始します。

  1. チャットチャンネル

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 メソッドのみを使用しています。

于 2012-09-10T09:44:32.817 に答える