2011-04-27 1 views
7

Я имею в виду интеллектуальную систему, которая может выбирать между доступными службами OSGi динамически. То есть, выберите реализацию или другую в зависимости от некоторого параметра времени выполнения. Например, сообщите об этом алгоритму, который изменит оператор после нескольких итераций или в зависимости от балансировки нагрузки в системе или любого другого.Как выбрать в среде выполнения нескольких сервисов OSGi интеллектуальным способом?

while(stopCriterion){ 
    operator.doSomething(); //There exist many operator implementations 
} 

Мой первый подход заключается в использовании DS разоблачить услуг и связывать услуги с 0..n и динамической политики. Затем из внешнего компонента уведомляет алгоритм, который использует сервис на каждой итерации (используя EventAdmin, может быть?).

operator[selected].doSomething(); 

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

Однако я не знаю, является ли это хорошая идея или существует еще один лучший механизм для динамического выбора того, какую реализацию использовать. Я думаю, что использование ServiceTracker вместо DS не является хорошим вариантом, но я открыт для предложений :)

Заранее спасибо.

ответ

5

Это выглядит как шаблон стратегии, который вполне может быть реализован с использованием сервисов. Если у вас есть тип сервиса под названием Operator (и имеют интерфейс с таким же именем), это будет работать примерно так:

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

Я предполагаю, что вы можете поместить стратегию выбора в сервис селектора, но если это действительно внешний компонент, вы можете использовать любой механизм, который вам нравится обрабатывать связь между интеллектуальным компонентом и селектором: интерфейс службы , событие и т.д.

+0

Привет Энди. Мне нравится ваша идея о промежуточном селекторном сервисе для выбора соответствующего экземпляра :) Однако разработчики «Operators» и «Algorithms», вероятно, не знакомы с OSGi, и я думаю, что Selector может их смутить. Во всяком случае, я нашел ваш комментарий элегантной формой для решения моей проблемы. Если никто не даст мне другого решения, я помету ваш ответ как «проверенный» (это мой первый вопрос в StackOverflow, я не знаю, могу ли я проверить больше, чем ответить или изменить свой выбор). –

+0

Нет необходимости, чтобы операторы-разработчики много знали о OSGi, поскольку они просто реализуют правильный интерфейс. Что касается принятия ответа: я не думаю, что вы можете пересмотреть свой выбор, поэтому выбирайте разумно. (Или посмотрите [faq] (http://stackoverflow.com/faq) для получения дополнительных указаний.) –

+0

Спасибо Angelo (не Энди!). Ваша идея классная, потому что селектор также может связывать другие сервисы, которые «Алгоритм» использует для извлечения информации :) (я не могу повысить ваш ответ, но мне нужна большая репутация). –

0

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

Грубая реализация могла бы выглядеть так:

public Worker { 
    private Operator operator; // your actual operator strategy 
    public void setOperator(Operator actualOperator) { 
    this.operator = operator; 
    } 

    public doSomething() { 

    while(stopCriterion) { 
     Operator operatorForThisIteration = operator; // pick the injected service 
     operatorForThisIteration.doSomething; 
    } 
    } 
} 

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

+0

Привет, Андреас. Я ищу свободную связь, используя возможности OSGi. «Интеллект» должен находиться за пределами «Рабочего» (а также необязательно), но не управлять Работниками. Тем не менее я отмечаю вашу идею использовать его в других проблемах;) –

+0

@Pablo - соединение довольно свободно, 'Operator' - это интерфейс, а не реализация сервиса ..!? –

Смежные вопросы