Как я могу различать опубликованные службы OSGI, реализующие один и тот же интерфейс по своим свойствам?
Поиск услуг OSGI по свойствам
Ответ 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)"/>