ダイナミズムおよび Blueprint Container

Blueprint プログラミング・モデルでは、登録リスナー または参照リスナーを使用して、サービスが使用可能になる時に バンドルが制御を行えるようにすることができます。

例えば、バンドルにオプション・サービスがあり、このバンドルは、サービスが使用可能になる時に使用を開始し、サービスが使用不可になる時に使用を停止するとします。 参照リスナーを使用すると、 このオプション・サービスが使用可能または使用不可になるときにバンドルに通知 されるようにすることができます。

サービス参照マネージャー、すなわち、参照マネージャーまたは 参照リスト・マネージャーは、ゼロ以上の登録リスナーと、 ゼロ以上の参照リスナーを保持することができます。
  • 登録リスナーは、サービスの登録直後、あるいはサービスの登録抹消直前に コールバック・メソッドが呼び出されるようにするオブジェクトです。
  • 参照リスナーは、サービスがサービス参照マネージャーによって選択されたとき、 あるいはサービスがサービス参照マネージャーによってもう使用されていないときに、 コールバック・メソッドが呼び出されるようにするオブジェクトです。

登録リスナー

登録リスナーを指定するには、registration-listener エレメント を使用し、さらに registration-method 属性と unregistration-method 属性を使用してコールバック・メソッドを 指定します。 コールバック・メソッドを最上位マネージャーへの参照として提供するオブジェクトを指定することもできれば、registration-listener エレメント内でインライン宣言を使用することもできます。

サービスが ServiceFactory インターフェースを 実装する場合、登録および登録抹消用のコールバック・メソッドには以下のシグニチャーが必要です。 ここで、anyMethod は任意のメソッド名を表します。
void anyMethod(ServiceFactory, Map)
サービスが ServiceFactory インターフェースを 実装しない場合、登録および登録抹消用のコールバック・メソッドは以下のシグニチャーと一致する必要があります。
void anyMethod(? super T, Map)
最初の 引数はサービス・オブジェクトのインスタンスです。 タイプ T は、サービス・オブジェクトの タイプから割り当てられる必要があります。 2 番目の引数は、サービスに関連付けられた 登録プロパティーを示します。

登録リスナーがコールバックについて複数の多重定義メソッドを保持している場合は、 一致するシグニチャーを持つメソッドがすべて呼び出されます。

以下の部分的なJava™クラスとBlueprint XMLのサンプルコードは、単純な登録リスナーを示しています。

public class RegistrationListener {
   public void register(Account account, Map properties) {
      ...
   }
   public void unregister(Account account, Map properties) {
      ...
   }
}
<service id="serviceSix" ref="myAccount" auto-export="all-classes">
   <registration-listener 
      registration-method="register" unregistration-method="unregister">
      <bean class="org.apache.aries.RegistrationListener"/>         
   </registration-listener>
</service>

参照リスナー

参照リスナーを指定するには、reference-listener エレメントを 使用し、さらに bind-method 属性と unbind-method 属性を使用してコールバック・メソッドを 指定します。 コールバック・メソッドを最上位マネージャーへの参照として提供するオブジェクトを指定することもできれば、reference-listener エレメント内でインライン宣言を使用することもできます。

バインドおよびアンバインドのコールバック・メソッドには 以下のいずれかのシグニチャーを指定できます。 ここで、anyMethod は任意のメソッド名を表します。
  • void anyMethod(ServiceReference)

    この引数は、バインドまたは アンバインドされるサービスの ServiceReference オブジェクトです。

  • void anyMethod(? super T)

    この引数は、 バインドまたはアンバインドされるサービス・オブジェクト・プロキシーです。 タイプ T は、 サービス・オブジェクトから割り当てられる必要があります。

  • void anyMethod(? super T, Map)

    この最初の引数は、 バインドまたはアンバインドされるサービス・オブジェクト・プロキシーです。 タイプ T は、 サービス・オブジェクトから割り当てられる必要があります。 2 番目の引数は、サービスに関連付けられた サービス・プロパティーを示します。

参照リスナーがコールバックについて複数の多重定義メソッドを保持している場合は、 一致するシグニチャーを持つメソッドがすべて呼び出されます。

参照リスト・マネージャーの場合、リスナー・コールバックは、 一致するサービスがサービス・レジストリーに追加されたり、レジストリーから除去されたり するたびに呼び出されます。 ただし、参照マネージャーの場合、このマネージャーがあるサービスに既に バインドされ、より低いランキングのマッチング・サービスがサービス・レジストリーに 追加されたときには、バインド・コールバックは呼び出されません。 同様に、 このマネージャーのバインド先であるサービスがなくなり、直ちに別のマッチング・サービスに 置き換えられても、アンバインド・コールバックは呼び出されません。

参照マネージャーを使用してステートフルなサービスと対話する 場合は、サービスの状態を適切に管理できるように、参照リスナーを使用して プロキシーのバッキング・サービスを追跡することが重要になります。

以下の部分的なJavaクラスとBlueprint XMLのサンプルコードは、単純な登録リスナーを示しています。 ReferenceListener クラスには 2 つのバインド・コールバック・ メソッドと 1 つのアンバインド・コールバック・メソッドがあります。これらのメソッドは、 サービス参照リスト・マネージャーからのサービスのバインドおよびアンバインド時に呼び出されます。

public class ReferenceListener {
   public void bind(ServiceReference reference) {
      ...
   }
   public void bind(Serializable service) {
      ...
   }
   public void unbind(ServiceReference reference) {
      ...
   }       
}
<reference-list id="serviceReferenceListTwo" 
   interface="org.apache.aries.simple.Account" availability="optional">
   <reference-listener bind-method="bind" unbind-method="unbind">
      <bean class="org.apache.aries.ReferenceListener"/>        
   </reference-listener>
</reference-list>