16

プロパティによって同じインターフェイスを実装する公開された OSGI サービスを区別するにはどうすればよいですか?

4

3 に答える 3

19

プロパティの特定の値に基づいて登録済みのサービスを取得すると仮定すると、( LDAP構文に基づく)フィルターを使用する必要があります。

例えば:

int myport = 5000;
String filter = "&(objectClass=" + MyInterface.class.getName() 
                + ")(port=" + myport + ")";
ServiceReference[] serviceReferences = bundleContext.getServiceReferences(null,filter);

MyInterfaceを実装しており、プロパティの値が にport等しいサービスを探しますmyport

参照を取得するための関連する javadoc は次のとおりです

備考 1:

上記の例と javadoc は、リリース 4.2 を参照しています。J2SE 1.4 ランタイムに制限されていない場合は、ジェネリックを使用できるリリース 4.3 の構文を確認することをお勧めします。

備考 2: (Ray 提供)

文字列からFilterオブジェクトを作成する代わりに、フィルターの正確性を事前にチェックすることもできます。filterStr

Filter filter = bundleContext.createFilter(filterStr);  

これにより、フィルターを他の基準と一致させることもできます。引数filterStrを説明するオーバーロードがないため、引き続き参照を取得するために渡します。ただし、この方法では正確性を 2 回チェックすることに注意Filterしてください。確かに目を見張るような非効率性ではないと思いますが、言及する価値はあります。getServiceReferencescreateFilterInvalidSyntaxException

于 2012-06-22T07:08:13.573 に答える
9

上記のルカの答えは正しいですが、サービスにアクセスするために低レベルの API を使用していることを前提としています。

Declarative Services を使用している場合 (一般的にはこれをお勧めします)、フィルターをtargetサービス参照の属性に追加できます。例 (DS の bnd アノテーションを使用):

@Reference(target = "(port=8080)")
public void setHttpService(HttpService http) {
    // ...
}
于 2012-06-22T13:32:15.953 に答える
2

ブループリントでは、reference または reference-list 要素に filter 属性を指定できます。例えば:

<reference id="sampleRef"
        interface="org.sample.MyInterface"
        filter="(port=5000)"/>
于 2012-06-25T05:25:38.063 に答える