Как выбрать во время выполнения среди нескольких услуг OSGI интеллектуально?

StackOverflow https://stackoverflow.com/questions/5804059

Вопрос

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

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

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

operator[selected].doSomething();

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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;
     }
  }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top