Статьи

Свойства в OSGi Декларативные службы и ServiceTracker

Как было предложено в моем последнем блоге « Зависимости и сервисы в корпоративных приложениях OSGI », похоже, что началась новая серия блогов 😉

ServiceTracker против декларативных услуг

В прошлый раз было только краткое заявление — теперь некоторые советы следуют тому, как использовать свойства в ServiceTracker vs Declarative Services (DS).

ServiceTracker из моего проекта OSGI сервера был открыт с этим фильтром:

final String filterPool = "("
+Constants.OBJECTCLASS
+ "="
+ JDBCPoolComponent.class.getName()
+")";

Поэтому ServiceTracker получит сервисы типа JDBCPoolComponent — нас интересует атрибуция JndiName:



private void processDataSources(JDBCPoolComponent service) {
  if (service.getJndiName().equals("foo_entity_data_source_hsql")) {
  // do something
  }
}

Как это можно сделать с помощью декларативных служб ( equinox.ds ): 

Мы определяем ссылку, чтобы получить ровно одну конкретную службу типа JDBCPoolComponent, чтобы знать, что DataSource готов. 

Первой идеей объявить эту ссылку может быть:



Запуск приложения OSGI, но ссылка не была решена. 

Как мы могли найти причину?
Сначала мы должны проверить, правильно ли установлен фильтр и нет ли опечатки в интерфейсе.
Совет: используйте Equinox OSGI Console для тестирования фильтра!
Попробуйте эту команду:
услуги (& (objectclass = org.ow2.easybeans.component.jdbcpool.JDBCPoolComponent)
(JndiName = foo_entity_data_source_hsql))

 

Но Сервис не найден: Сервис не зарегистрирован. В качестве следующего мы пытаемся искать только сервисы интерфейса JDBCPoolComponent . Теперь наша команда выглядит так: 

услуги (objectclass = org.ow2.easybeans.component.jdbcpool.JDBCPoolComponent)

Некоторые Услуги были перечислены — мы также видим тот, который мы ищем

{org.ow2.easybeans.component.jdbcpool.JDBCPoolComponent} = {classname = org.ow2.easybeans.component.jdbcpo ……, xmlconfig =
  Зарегистрировано в комплекте: … / easybeans-component-jdbcpool_1.1.0-M3-SNAPSHOT.jar /

Анализируя напечатанный текст, мы нашли: jndiName = «foo_entity_data_source_hsql» Но есть небольшая разница: это свойство xmlconfig, содержащее информацию. Вот решение:

услуги (& (objectclass = org.ow2.easybeans.component.jdbcpool.JDBCPoolComponent)
(Xmlconfig = * foo_entity_data_source_hsql *))

Сервис, на который мы хотим сослаться, будет найден, и мы знаем, как объявить ссылку внутри Компонента сервиса:



Почему ServiceTracker может использовать   getJndiName () , а целевой фильтр — нет? getJndiName () — это метод JDBCPoolComponent , но JndiName не зарегистрирован как свойство службы! 

Целевой фильтр не может получить доступ к методам реализации — только к свойствам службы. 

Возможно, вы столкнетесь с этим с помощью комплектов 3rdParty, где вам придется жить с их услугами как есть. Если вам повезло с открытым исходным кодом, вы пишете Bugzilla или JIRA и исправляете это за несколько часов 🙂

Замечание:

Вы можете взглянуть на мою серию блогов о « OSGI Enterprise Applications » — индекс находится в колонке рядом с  этим блогом .

Есть также некоторые материалы для EclipseCon 2009 — если вы хотите услышать больше о: комментарии приветствуются 😉

С http://ekkes-corner.blogspot.com/