Как было предложено в моем последнем блоге « Зависимости и сервисы в корпоративных приложениях 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, но ссылка не была решена.
Как мы могли найти причину? Сначала мы должны проверить, правильно ли установлен фильтр и нет ли опечатки в интерфейсе.
услуги (& (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 — если вы хотите услышать больше о: комментарии приветствуются ?