Поиск услуг OSGI по свойствам - программирование
Подтвердить что ты не робот

Поиск услуг OSGI по свойствам

Как я могу различать опубликованные службы OSGI, реализующие один и тот же интерфейс по своим свойствам?

4b9b3361

Ответ 1

Предполагая, что вы хотите получить зарегистрированные службы на основе определенных значений свойств, вам необходимо использовать фильтр (который основан на 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, чтобы получить ссылки, так как нет перегрузки, которая учитывает аргумент Filter. Однако имейте в виду, что таким образом вы проверите правильность дважды: как getServiceReferences, так и createFilter throw InvalidSyntaxException при разборе фильтра. Разумеется, я не думаю, что это неэффективность шоу-стопперов, но стоит упомянуть.

Ответ 2

Ответ Luca выше правильно, однако предполагается, что вы используете API низкого уровня для доступа к службам.

Если вы используете Declarative Services (который я обычно рекомендую), то фильтр может быть добавлен в атрибут target ссылки на службу. Например (используя аннотации bnd для DS):

@Reference(target = "(port=8080)")
public void setHttpService(HttpService http) {
    // ...
}

Ответ 3

В Blueprint вы можете указать атрибут фильтра в элементе reference или reference-list. Например:

<reference id="sampleRef"
        interface="org.sample.MyInterface"
        filter="(port=5000)"/>