Как выбрать во время выполнения среди нескольких услуг OSGI интеллектуально?
-
24-10-2019 - |
Вопрос
Я вмещаюсь в интеллектуальную систему, которая может динамически выбрать среди доступных услуг 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;
}
}
}
И другая услуга, которая может вводить зависимости в экземпляры работников, будет поддерживать список всех экземпляров работников, внедрить некоторую логику для выбора новой услуги и внедрить всех (или некоторых) работников.