2011-04-27 7 views
7

Mam na myśli inteligentny system, który może dynamicznie wybierać spośród dostępnych usług OSGi. To znaczy wybierz implementację lub inną zależnie od jakiegoś parametru środowiska wykonawczego. Na przykład powiadomić działający algorytm, który zmienia operatora po kilku iteracjach lub w zależności od równoważenia obciążenia w systemie lub cokolwiek innego.Jak wybrać w środowisku wykonawczym kilka usług OSGi w inteligentny sposób?

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

Moje pierwsze podejście jest użycie DS narazić usług i powiązać usługi z 0..N i dynamicznego polityki. Następnie, z zewnętrznego komponentu inteligentnego, powiadom algorytm, który serwis używa w każdej iteracji (przy użyciu EventAdmin, może?).

operator[selected].doSomething(); 

Pomoże mi to zmniejszyć złożoność, gdy trzeba wykonać wiele eksperymentów z wieloma różnymi implementacjami usług. Również Mam zamiar użyć specyfikację zdalnych usług z Eclipse Communication Framework zrobić badania w rozproszonych algorytmów i takie rzeczy, więc dynamicznie pojawienie się nowych wdrożeń w czasie wykonywania może być również możliwe

Jednak nie wiem, czy jest to na Dobry pomysł lub istnieje inny, lepszy mechanizm do dynamicznego wyboru, którego zastosowania implementacji. Myślę, że używanie usługi ServiceTracker zamiast tego nie jest dobrym rozwiązaniem, ale jestem otwarty na sugestie :)

Z góry dziękuję.

Odpowiedz

5

To wygląda jak wzorzec strategii, który można bardzo dobrze zaimplementować za pomocą usług. Zakładając, że masz rodzaj usługi o nazwie Operator (i mają interfejsu o tej samej nazwie), to będzie działać mniej więcej tak:

  • Tworzenie OperatorProvider usługę, która zawiera niezbędne funkcjonalności oraz kilka dodatkowych informacji (takich jak, kiedy ta implementacja jest odpowiednia) i utworzyć pewną liczbę takich przypadków, po jednej dla każdej ze strategii.
  • Utwórz usługę selektora, która implementuje interfejs Operator i przekazuje wszystkie połączenia do usługi najbardziej odpowiedniemu OperatorProvider. Sposób, w jaki ta usługa wybiera najbardziej odpowiedniego dostawcę, jest prawdopodobnie częścią inteligencji.
  • Faktyczny użytkownik usługi ma teraz zależność tylko od usługi Operator i nie musi się martwić o wybór dostawcy.

Zakładam, że możesz wybrać strategię wyboru w usłudze selektora, ale jeśli naprawdę jest to komponent zewnętrzny, możesz użyć dowolnego mechanizmu, który chcesz obsługiwać komunikację między komponentem inteligentnym a selektorem: interfejs usługi , imprezy, itp

+0

Cześć Andy. Podoba mi się twój pomysł pośredniej selekcji, aby wybrać odpowiednią instancję :) Jednak twórcy "Operatorów" i "Algorytmy" prawdopodobnie nie są zaznajomieni z OSGi i myślę, że Selektor mógł je zmylić. W każdym razie znalazłem twój komentarz w eleganckiej formie, aby rozwiązać mój problem. Jeśli nikt nie daje mi innego rozwiązania, zaznaczę twoją odpowiedź jako "sprawdzoną" (to jest moje pierwsze pytanie w StackOverflow, nie wiem czy mam, czy mogę sprawdzić więcej niż odpowiedź lub zmienić mój wybór). –

+0

Nie ma potrzeby, aby operatorzy operatora wiedzieli dużo o OSGi, o ile tylko zaimplementują poprawny interfejs. Co do akceptacji odpowiedzi: nie sądzę, że możesz zmienić swój wybór, więc wybieraj mądrze. (Lub zobacz [faq] (http://stackoverflow.com/faq) po więcej wskazówek.) –

+0

Dzięki Angelo (nie Andy!). Twój pomysł jest fajny, ponieważ Selector może także wiązać inne usługi, których "Algorytm" używa do wyodrębniania informacji :) (Nie mogę jeszcze przyjąć twojej odpowiedzi, potrzebuję więcej reputacji). –

0

Chyba, jakiś dynamiczna strategia wzór lub nawet zależność wtrysku mogłyby pasować do Twoich potrzeb. Niektóre klasy używają strategii (nazywasz ją operator), która może się zmieniać w czasie wykonywania. Myślę, że masz inną usługę, która może powiedzieć, którą strategię zastosować (na podstawie parametrów środowiska wykonawczego).

A rough realizacja mogłaby wyglądać tak:

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

a kolejne usługi, który może wstrzyknąć współzależności do wystąpień robotniczych, by zachować listę wszystkich wystąpień robotniczych, wdrożyć niektóre logiki, aby wybrać nową usługę i wstrzyknąć wszystkim (lub niektórym) pracownikom.

+0

Witam Andreas. Szukam luźnego sprzężenia za pomocą funkcji OSGi. "Inteligencja" powinna znajdować się poza "robotnikiem" (a także opcjonalnie), ale nie może zarządzać pracownikami. Niemniej jednak zauważam twój pomysł użycia go w innych problemach;) –

+0

@Pablo - sprzężenie jest dość luźne, 'Operator' jest interfejsem, a nie implementacją usługi ..!? –

Powiązane problemy