プロパティによって同じインターフェイスを実装する公開された OSGI サービスを区別するにはどうすればよいですか?
3 に答える
プロパティの特定の値に基づいて登録済みのサービスを取得すると仮定すると、( 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
してください。確かに目を見張るような非効率性ではないと思いますが、言及する価値はあります。getServiceReferences
createFilter
InvalidSyntaxException
上記のルカの答えは正しいですが、サービスにアクセスするために低レベルの API を使用していることを前提としています。
Declarative Services を使用している場合 (一般的にはこれをお勧めします)、フィルターをtarget
サービス参照の属性に追加できます。例 (DS の bnd アノテーションを使用):
@Reference(target = "(port=8080)")
public void setHttpService(HttpService http) {
// ...
}
ブループリントでは、reference または reference-list 要素に filter 属性を指定できます。例えば:
<reference id="sampleRef"
interface="org.sample.MyInterface"
filter="(port=5000)"/>