Я пытаюсь разобраться с OSGi Services. Главный вопрос, который я задаю себе, заключается в следующем: какая польза от использования сервисов вместо работы с пакетами и их экспортированными пакетами?
Насколько я знаю, похоже, что концепция Late Binding имеет какое-то отношение к ней. Зависимости привязки соединены вместе при запуске пучка, поэтому они довольно исправлены, я думаю. Но с услугами, похоже, почти то же самое. Пакет запускает и регистрирует службы или привязки к службам. Конечно, услуги могут приходить и уходить, когда они хотят, и вам нужно следить за этими шансами. Но основная идея не кажется мне совсем другой.
Другим аспектом этого является то, что услуги более гибкие. Для одного конкретного интерфейса может быть много реализаций. С другой стороны, может быть множество различных реализаций для определенного экспортированного пакета.
В другом тексте я читал, что недостатком использования экспортированных пакетов является то, что они делают приложение более хрупким, чем сервисы. Автор писал, что если вы удаляете один пакет из графика зависимости, то другие зависимости больше не будут выполняться, что может вызвать эффект домино на всем графике. Но не может ли такое же случиться, если служба отключится? Для меня это похоже на то, что сервисные зависимости не лучше, чем зависимости пакетов.
До сих пор я не мог найти сообщение в блоге, книгу или презентацию, в которых можно было бы четко описать, почему услуги лучше, чем просто раскрывать функциональность, экспортируя и импортируя пакеты.
Подводя итоги:
Каковы основные преимущества использования служб OSGi, которые делают их выше, чем экспорт и импорт пакетов?
Добавление
Я попытался собрать дополнительную информацию об этой проблеме и придумал какое-то сравнение между простым экспортом/импортом пакетов и сервисов. Возможно, это поможет нам найти удовлетворительный ответ.
-
Start/Stop/Update
Оба, пакеты (следовательно, пакеты) и сервисы могут быть запущены и остановлены. Кроме того, они могут быть обновлены. Услуги также привязаны к самому жизненному циклу пучка. Но в этом случае я имею в виду, если вы можете запускать и останавливать службы или пакеты (чтобы экспортированные пакеты "исчезали" ).
-
Отслеживание изменений
ServiceTracker и BundleTracker позволяют отслеживать и реагировать на изменения в доступности пакетов и сервисов.
-
Конкретные зависимости от других пакетов или сервисов.
Если вы хотите использовать экспортированный пакет, вам необходимо его импортировать.
Import-Package: net.jens.helloworld
Будет ли net.jens.helloworld предоставлять услугу, мне также потребуется импортировать пакет, чтобы получить интерфейс.
Таким образом, в обоих случаях их будет какая-то "плотная связь" с более или менее конкретным пакетом.
-
Возможность иметь более одной реализации
Конкретные пакеты могут экспортироваться более чем одним пакетом. Может быть пакет net.jens.twitterclient, который экспортируется пакетом A и пакетом B. То же самое относится к службам. Интерфейс net.jens.twitterclient.TwitterService может быть опубликован пучками A и B.
Чтобы суммировать это здесь, короткое сравнение (Exported packages/services):
- ДА/ДА
- ДА/ДА
- ДА/ДА
- ДА/ДА
Поэтому нет никакой разницы.
Кроме того, кажется, что услуги добавляют дополнительную сложность и вводят еще один уровень зависимостей (см. image ниже).
alt text http://img688.imageshack.us/img688/4421/bundleservicecomparison.png
Итак, если нет никакой реальной разницы между экспортируемыми пакетами и услугами, в чем преимущество использования сервисов?
Мое объяснение:
Использование служб кажется более сложным. Но сами услуги кажутся более легкими. Это должно быть различие (с точки зрения производительности и ресурсов), если вы запускаете/останавливаете весь пакет или просто начинаете и останавливаете конкретную услугу.
С архитектурной точки зрения я также предполагаю, что связки можно рассматривать как основу приложения. Фонд не должен часто меняться с точки зрения запуска и остановки пучков. Функциональность обеспечивается службами этих пакетов в некотором динамическом слое над слоем пакета. Этот "сервисный уровень" может подвергаться частым изменениям. Например, служба для запроса базы данных не регистрируется, если база данных отключена.
Каково ваше мнение? Я начинаю получать весь смысл услуг, или я все еще думаю не так? Есть ли вещи, которые мне не хватает, что сделает услуги гораздо более привлекательными по сравнению с экспортируемыми пакетами?