Служба OSGI против Синглтона?

Я новичок в OSGI, и мне интересно, сможет ли кто-нибудь рассказать мне о разнице между созданием службы OSGI и шаблоном синглтона. Например, предположим, у меня есть пакет core, который предоставляет IService и несколько пакетов, для которых требуется доступ. Я могу:

  1. зарегистрируйте сервис в core, в котором плагины могут получить доступ
  2. предоставить одноэлементный класс, который предоставляет сервис

Использование службы OSGI кажется довольно громоздким; и поскольку плагины должны в любом случае зависеть от Core (чтобы получить интерфейс), в чем преимущество использования сервиса OSGI?

12 голосов | спросил Adrian Pang 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 27 Sep 2012 21:25:03 +0400 2012, 21:25:03

4 ответа


0

Краткий ответ: если вам не нужны (и не понадобятся) преимущества службы OSGi (например, реализации динамически управляемых служб и поиска служб), тогда вам не нужна служба OSGi.

Но здесь нужно рассмотреть еще кое-что, кроме того, будет ли услуга громоздкой. Черт возьми, сама OSGi может считаться громоздкой. Нужно ли другому пакету предоставлять реализацию этого класса? Возможно, нет. Будет ли когда-либо пакет Core отключен или по-другому не сможет обеспечить реализацию по требованию? Может быть.

Чтобы определить, подходит ли данный сервис для рассматриваемого класса, ознакомьтесь с кратким описанием конкретных преимуществ сервиса в Что такое страница OSGi . У них есть очень хорошее объяснение того, как ваш синглтон-класс может стать более громоздким, чем сервис.

Удачи.

ответил user1201210 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 27 Sep 2012 21:51:32 +0400 2012, 21:51:32
0

Службы - это соединения между независимыми модулями . Наличие модулей в зависимости от сервисов (с их пакетами спецификаций) может значительно уменьшить связь между модулями и, таким образом, обеспечить большую часть преимуществ модульности.

Я думаю, что шаблон синглтона используется двумя различными способами: вы просто хотите, чтобы один и тот же объект был общим для нескольких пользователей (например, служба журналов), или вы действительно можете иметь только один экземпляр (например, есть только один фрагмент аппаратное обеспечение). В целом, я вижу, что большинство людей в мире корпоративного программного обеспечения говорят о первом. Тем не менее, опыт показывает, что когда проекты растут, синглтоны становятся не единичными, а более общими объектами или, по крайней мере, кажущимися общими объектами. Приятно то, что в OSGi вы можете моделировать оба, и клиенты «синглтона» не обращают на это внимания, а также не требуют какой-либо центральной конфигурации. Причина в том, что OSGi полагается на ответственные модули, регистрация службы является локальным решением, так же как и прослушивание службы.

Сила сервисов не в их динамике (хотя они классные, особенно во время разработки), суть сервиса заключается в том, что они обеспечивают полное локальное управление внутри модуля без центральной конфигурации. Как только вы поймете, насколько это мощно, пути назад уже нет: -)

Наконец, сервисы OSGi не громоздки, потому что у нас есть DS с аннотациями. Регистрация службы теперь намного проще, чем создание bean-компонента Spring, без XML и без центральной конфигурации:


// A component registered as a ISingleton service
@Component
public class MyImpl implements ISingleton {
  void doSingle() { ... }
}

// A component that uses the ISingleton component
@Component
public class MyConsumer {

  @Reference
  void setISingleton(ISingleton is) { ... }
}

... И динамика приходит в основном бесплатно ...

ответил Peter Kriens 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 28 Sep 2012 10:34:40 +0400 2012, 10:34:40
0

Моя Операционная модель OSGi Threading Model привела меня к убеждению, что каждый сервис является единственным для потребителя услуг. В качестве единственного объекта службы регистрируются в реестре службы osgi. (но вы также можете изменить это поведение). Итак, что касается программирования, поведение одноэлементного класса и службы OSGi одинаково. Ваши переменные уровня класса распределяются между различными вызовами потребителей услуг.

Я скажу, что OSGI Service является Singleton ++

Но есть и различия. OSGi предоставляет вам отдельный загрузчик классов для каждого сервиса, что невозможно в одиночку. Все классы {singleton} загружаются одним загрузчиком классов. У нас не может быть двух классов с одинаковыми именами (полностью определенными именами) в одиночном коде, но это возможно в OSGi.

В определенных ситуациях мы должны подтвердить, что класс должен быть загружен только один раз (создание фабрики сеансов hibernate, инициализация службы hdfc, создание POJO, которые являются тяжелыми инициализациями, требуется только один раз). Теперь, если вы несколько раз живете в сценарии Java EE, ваш синглтон-класс загружается дважды двумя разными загрузчиками классов. Таким образом, это приводит к двойному выполнению статического блока; ненужная работа. Такие проблемы загрузчика классов легко решаются OSGi (поскольку вы новичок, я чувствую, что загрузка классов сама по себе станет проблемой для вас в ближайшие несколько дней).

Еще одна замечательная функция, предоставляемая OSGi, - это обновление пакета. Представьте, что вы изменили код в своем классе синглтона. Теперь вам нужно развернуть этот обновленный класс в вашем запущенном приложении. По сути, вам необходимо перезапустить систему, чтобы каждый загрузчик синглтон-классов обновлял новый экземпляр синглтона. Это не требуется в OSGi, просто обновите пакет.

Я скажу, что если вы собираетесь разрабатывать для более крупных приложений (масштаб предприятия) или если вам нужно разрабатывать код для ограниченной аппаратной емкости (малые ограничения памяти, низкая вычислительная мощность), тогда лучше всего выбрать OSGi. для крайних целей. Для всех остальных ваша нормальная кодировка Java будет работать отлично.

ответил sailor 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 28 Sep 2012 09:29:52 +0400 2012, 09:29:52
0

Вы можете управлять жизненным циклом (развертывать новую версию службы, одновременно запускать несколько версий и т. д.) службы, но вы не можете управлять жизненным циклом singleton без перезапуска JVM (даже при перезапуске вы можете просто иметь 1 версия доступна в любой момент времени).

ответил Aravind R. Yarram 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 27 Sep 2012 21:42:54 +0400 2012, 21:42:54

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132