Пакет (или услуга) OSGI - как зарегистрироваться на данный период времени? - PullRequest
1 голос
/ 17 декабря 2010

Поиск не дал мне подсказки, как мне вести себя в следующей ситуации:

Я бы хотел иметь 2 реализации OSGI с одним и тем же интерфейсом: одна обычная, другая должна работать (бытьактивно / присутствует / что угодно) в данный период времени (например, для рождественских недель:))

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

Я новичок, может быть, я где-то не совсем понимаю концепцию OSGI, извините за подсказкуили ссылку, извините за мой английский.

Использование Felix / Equinox с Apache Aries.

Ответы [ 5 ]

3 голосов
/ 20 декабря 2010

Издатель службы может регистрировать и отменять регистрацию этой службы в любое время, используя обычный API. Если он выберет, он может сделать это согласно некоторому регулярному расписанию.

Если существует другой экземпляр службы, который доступен непрерывно, то потребитель службы иногда увидит два экземпляра службы, а иногда увидит один. Если доступен только один экземпляр, то получить этот экземпляр тривиально. Когда есть два экземпляра, вам нужен способ гарантировать, что вы получите свой «предпочтительный» экземпляр. Свойство SERVICE_RANKING является способом сделать это. Метод getService обычного ServiceTracker всегда будет возвращать услугу с более высоким рейтингом, так что это будет соответствовать вашим требованиям.

1 голос
/ 18 декабря 2010

Мне еще предстоит увидеть контейнер OSGI, который на уровне платформы поддерживает доступность сервисов на основе даты / времени.

На вашем месте я бы просто отбросил прокси-сервис перед двумя реализациями интерфейса и поместил в него вызов сервиса, основанный на логике даты.

0 голосов
/ 04 января 2011

Хорошо, что я наконец-то сделал ...

  1. Реализован общий диспетчерский пакет - и через него вызывается любая из служб (поэтому cron не нужен, когда вызов по требованию)
  2. Когда диспетчер получает запрос - он ищет интерфейс в своем собственном кэше и -
  3. Когда существует> 1 служба с одинаковым ранжированием и оба равны (зарегистрированы) - тогда
  4. Диспетчер разрешает необходимую службу с помощью собственной письменной аннотации @TimigPolicy с полями «от» и «до»
  5. Для данного сервера new datetime () - диспетчер возвращает правильный экземпляр службы

Много работы, я должен сказать :) Но работает почти идеально:)

Спасибо всем за подсказки, это было очень полезно !!!

0 голосов
/ 30 декабря 2010

Я согласен с Нилом, что служба должна публиковать себя только в том случае, если она действительно может быть вызвана.Мое решение этой проблемы состояло бы в том, чтобы все производители услуг зависели от «временной зависимости».Хотя такая зависимость недоступна в стандартных структурах зависимостей (таких как декларативные службы, Blueprint, iPOJO), она легко реализуется с помощью менеджера зависимостей Apache Felix, который позволяет создавать собственные типы зависимостей.Обратите внимание, что написание такой новой зависимости один раз - это труд, но если это основной компонент вашего приложения, я думаю, оно того стоит.Потребителям сервисов не потребуется особая логика, они просто будут вызывать сервис, который был там.

0 голосов
/ 21 декабря 2010

Я не верю, что какая-либо инфраструктура поддерживает то, о чем вы просите.

Если вы намереваетесь избегать сервисных фильтров, вы можете попробовать это.

Реализация PolicyService.Эта служба отвечает за принятие решения о том, какой экземпляр вашей службы должен быть зарегистрирован в определенный момент времени.Когда сервису политик приходится переключаться между реализациями, он просто использует регистрацию / отмену регистрации apis, как обычно.Реализация службы политики вы можете прочитать в файле конфигурации, в котором указан диапазон дат для сопоставления реализации службы.Это позволит вам добавить новое поведение, изменив файл конфигурации и установив новый пакет с новой службой.

...