Как я могу отфильтровать видимость службы OSGi?
OSGi использует сервис-ориентированную архитектуру: пакеты регистрируют объекты служб, которые используют другие пакеты. Публикация и связывание сервисов управляются фреймворком. Это полностью отделяет поставщиков услуг от пользователей услуг (за исключением необходимости согласовывать интерфейс службы).
Есть ли способ ограничить (по конфигурации), какие сервисы видны для каких пакетов?
Например, если у меня есть HttpService, все пакеты, в которых есть необходимость, могут устанавливать в него сервлеты. Я хотел бы сделать HttpService невидимым для отдельных пакетов.
Для дополнительных кредитов: в дополнение к простой фильтрации регистрации услуг, возможность изменять свойства регистрации. Так что даже если в пачке регистрируется сервлет с alias=/admin
Я могу изменить это на alias=/somethingelse
для потребления Pax Web Extender Whiteboard.
6 ответов
Есть ли способ ограничить (по конфигурации), какие сервисы видны для каких пакетов?
Как вы знаете, существует возможность фильтрации по свойствам служб, хотя это, вероятно, не дает того вида управления, о котором вы просите: службы по-прежнему видны для других пакетов, развернутых в платформе.
В dm-сервере SpringSource (модульном сервере приложений Java на основе OSGi с открытым исходным кодом) приложение может быть Scoped при его развертывании. Это позволяет вам развертывать несколько приложений (в отдельных областях), которые могут включать несовместимые версии зависимых пакетов, и в то же время разрешать совместное использование общих пакетов (путем их развертывания вне области - в так называемой глобальной области).
Если приложение / пакет в определенной области регистрирует службу OSGi, она доступна только для пакетов в одной и той же области. (Услуги также "ограничены".)
Это не волшебство: сервер оборачивает интерфейсы сервисов OSGi и использует свойства сервиса "под прикрытием", чтобы выполнять фильтрацию, необходимую на лету.
Я думаю, что это даст вам то разделение, которое вы ищете.
Для получения информации о сервере dm (не путать с Spring DM) перейдите на страницу dmServer SpringSource.org.
Стив Пауэлл
SpringSource; dm сервер разработки
Предстоящий R4.2 спецификации OSGi определит компонент под названием Find Hook, который позволяет точно:
"проверить возвращенный набор сервисных ссылок и при необходимости сократить набор возвращаемых сервисов"
Увидеть
http://www.osgi.org/download/r4-v4.2-core-draft-20090310.pdf раздел 12.5
Пожалуйста, обратите внимание, что R4.2 еще не окончательный, но я считаю, что основные реализации OSGi (Felix и Equinox) уже имеют код для этой дополнительной функциональности в своей магистрали
Я не пробовал это, но кажется, что это может помочь вам...
В OSGi R4 Component Spec описывается "Служба конфигурации администратора", которая, после 5-минутной проверки, может динамически изменять службы.
В конечном счете, я думаю, что вам нужно будет контролировать доступ к службам на основе некоторых согласованных значений конфигурации
Есть ли способ ограничить (по конфигурации), какие сервисы видны для каких пакетов?
Нет способа сделать это, используя свойства сервиса. Вы можете определить свое собственное свойство службы, которое указывает, какие пакеты должны использовать экспортируемую вами услугу, но нет никакого способа предотвратить использование ее другими пакетами.
Для дополнительных кредитов: в дополнение к простой фильтрации регистраций услуг, возможность> изменить свойства регистрации. Так что даже если пакет регистрирует сервлет с>alias=/admin, я могу изменить его на alias=/somethingelse для использования Pax Web >Extender Whiteboard.
Ну... это сложный вопрос. Вы можете определить свой собственный интерфейс сервлета "MyServlet" и экспортировать свои сервлеты, используя этот интерфейс. Затем другой пакет может использовать эти MyServlets и реэкспортировать их как сервлеты с измененными свойствами службы.
Кроме этого... понятия не имею.
Для дополнительных кредитов: в дополнение к простой фильтрации регистрации услуг, возможность изменять свойства регистрации. Так что даже если пакет регистрирует сервлет с псевдонимом =/admin, я могу изменить его на псевдоним = /thingelse для использования Pax Web Extender Whiteboard.
Используя iPOJO, вы можете довольно просто изменить свойства предоставляемых сервисов. Он имеет множество других функций, которые могут быть интересны для тех, кто много использует OSGi.
Если вы хотите ограничить доступность служб, лучше всего включить защиту OSGi. Он предназначен для ограничения того, какие сервисы, пакеты и другие вещи видны для каких пакетов. Например, вы можете сделать только определенную услугу доступной для пакета, подписанного вами (или использовать различные другие критерии).
Другой вариант, уже упоминавшийся, заключается в использовании сервисных хуков 4.2, которые позволяют использовать своего рода механизм безопасности "сделай сам".
Второй вопрос, изменение свойств, таких как конечная точка, в которой зарегистрирована служба, - это то, что вы можете сделать через ServiceRegistration, которое вы получаете при регистрации вашей службы. Изменения можно инициировать, став ManagedService и используя ConfigurationAdmin для самостоятельной настройки.