2010-01-05 21 views
5

Mam problem z wykryciem usług dostarczanych przez niektóre pakiety OSGi, które nie są aktywowane. Opiszę sytuację:Nie można znaleźć usługi, ponieważ pakiet OSGi nie jest aktywny.

  • Bundle A określa interfejs X
  • Wiązki B, C i D świadczenia usług, które implementują interfejs X
    • usług Pakiety te są zarejestrowanymi przez wiosennym DM, więc są tworzone tylko wtedy, gdy pakiet jest aktywny i wiosna DM inicjowana kontekstu aplikacji zdefiniowaną w wiązce
  • Bundle a jest aktywnym i w pewnym momencie pyta rejestru usług dla usług dla interfejsu X. Doe nie znajduje żadnego, ponieważ paczki B, C i D nie zostały przeniesione do stanu AKTYWNEGO (są ROZWIĄZANE).

Nie wydaje mi się, żebym mógł rozpocząć pakunki B, C lub D, a zatem zarejestrować swoje usługi. Zmuszanie ich do rozpoczęcia przez dodanie ich do config.ini nie jest opcją, ponieważ może istnieć dowolna liczba pakietów zainstalowanych w aplikacji (za pośrednictwem mechanizmu aktualizacji podobnego do p2 Eclipse), które implementują interfejs X.

Aplikacja jest aplikacją RCP opartą na Eclipse 3.5, używając Spring 2.5.6 i Spring DM 1.2.1.

Jak wymusić aktywację tych pakietów?

+0

Czy możesz podać informacje na temat otrzymywanych komunikatów o błędach? I: Pakiet A eksportuje interfejs X, a Pakiet B, C, D zaimportuje go, prawda? – akr

+0

Tak, interfejs X jest eksportowany przez pakiet A i importowany przez B, C i D. Nie ma żadnych komunikatów o błędach. Zapytanie o usługi implementujące X w rejestrze usług zwraca po prostu pustą listę. –

+0

Jaka jest liczność, o którą prosisz w "A"? Jeśli jest to '1..N', masz zależność cykliczną. –

Odpowiedz

6

To, co naprawdę masz problem z hierarchią zależności, proponowane przez Ciebie hackowe rozwiązanie jest po prostu pomocną bandą w kwestii.

To, co naprawdę należy wziąć pod uwagę, to architektura systemu, ponieważ efektywnie masz do czynienia z zależnością cykliczną (ponownie: dyskusja w komentarzach do oryginalnego postu). Masz (jak to lub nie) A wymaga usług od (iw pewnym sensie zależy od) B i C. Tymczasem B i C zależą bezpośrednio od A, i jako takie, nie mogą zacząć dopóki nie pojawi się A.

W najlepszym razie możesz napisać kod w B i C, aby nasłuchiwać istnienia A, ale to w najlepszym przypadku maskuje (jak wspomniałem) podstawowy problem. Powinieneś rozważyć podzielenie A na dwa pakiety, nazwijmy je A1 i A2.

A1 powinien zapewniać interfejs wymagany przez B i C (zależnie od). A2 powinno mieć odbiorców, dla których usługi B i C są zależne. Przy starcie, jeśli B i C są wymaganymi usługami, A1 musi zostać uruchomione, ale A2 może rozpocząć się później i wszystko powinno działać.

+0

Zamierzam wypróbować twoją sugestię i zobaczyć, co się stanie. Dzięki! –

0

Myślę, że znalazłem rozwiązanie tego problemu, choć wydaje się nieco hackish.

Przebiegłem przez this thread, gdzie Adrian Colyer sugerował, że zewnętrzny "moduł śledzący pakiet" może być odpowiedzialny za aktywację pakietów, gdy są one zainstalowane w strukturze.

Więc moje rozwiązanie było:

  • Dodaj niestandardowy nagłówek do wiązki B, C i D s odpowiednie manifesty, na przykład, "MojaApl-AutoStart: true"
  • Tworzenie detektor wiązki, która zaspokaja gdy pakiet zostanie przeniesiony do Rozdzielone stanie i wygląda na nagłówku
  • Jeżeli wartość nagłówka jest „prawda”, nazywa słuchacz wiązka bundle.start()

Używając tej metody, Bundl es Chcę zacząć, bez konieczności uciekania się do korzystania z config.ini, i mogą przychodzić i odchodzić, jak im się podoba, ale ich usługi są dostępne, gdy zapytał.

0

Zobacz także felix fileinstall, który obserwuje katalog pakietów i automatycznie instaluje i uruchamia je. Gdy plik zostanie usunięty, pakunek również zostanie zatrzymany i odinstalowany.

Powiązane problemy