2012-06-14 11 views
13

Mam pakiet OSGi z usługą trwałości (przy użyciu hibernate) i fragmentem, który zawiera konfigurację (plik xml). W aktywatora Bundle za, ja ładuje konfigurację przy użyciu:Kiedy jest dołączony fragment OSGi do hosta?

@Override 
public void start(BundleContext ctx) { 
    URL url = ctx.getBundle().getResource("hibernate.cfg.xml"); 
    SessionFactory sessionFactory = new AnnotationConfiguration().configure(url).buildSessionFactory(); 
} 

ale Czasami URL jest null. Kiedy próbowałem wyświetlić listę wszystkich dostępnych URL s (używając metody findEntries), okazało się, że własne pakiety są dostępne zawsze, ale fragmenty tylko czasami. Używam Felix 4.0.2, pakiet i fragment jest uruchamiany pod tym samym Felix. poziom auto.start.

Odpowiedz

22

Fragmenty dołączane do hosta w momencie rozstrzygnięcia hosta . Normalnie fragment zostanie dołączony, o ile jest zainstalowany przed rozwiązaniem hosta.

Jednak zawsze istnieje możliwość rozstrzygnięcia hosta bez fragmentu, ponieważ hosty nie zależą od ich fragmentów. Dlatego zwykle powinieneś napisać swojego hosta, aby mógł poradzić sobie z nieobecnym fragmentem - tzn. Nie powinien wyrzucać NPE itp.

Od OSGi R4.3 możesz wprowadzić zależność od hosta na jego fragmencie za pomocą Require-Capability i nagłówki. Tworząc własny obszar nazw dla zależności, możesz sprawić, by twój fragment dostarczył Provide-Capability. Wtedy Twój host może wymagać tego z Require-Capability .... teraz struktura OSGi zapewni, że fragment musi być dostępny, zanim rozwiąże hosta.

+0

Dzięki, wymagać/dostarczyć możliwości działa doskonale! – Kojotak

+0

To jest przydatne. Nigdy nie widziałem, żeby ten przypadek się nie udał (używamy Equinoxa), ale nie zdawałem sobie sprawy, że to nie uda się rozwiązać fragmentu "w czasie". Dobrze wiedzieć. – Robin

+3

Chciałbym, aby StackOverflow pozwalał mi subskrybować użytkowników, aby móc czytać wszystkie posty Neila. :-) Uczę się czegoś nowego prawie za każdym razem, gdy odpowiada! –

0

Fragment jest dołączony do hosta podczas procesu dzielenia pakietu fragmentów. Host zostaje rozwiązany i może się uruchomić, nawet jeśli nie ma tam fragmentu; ale fragment jest zależny od hosta - może zostać rozwiązany, a następnie uruchomiony dopiero po dołączeniu do hosta.

Posiadanie obu pakietów z tym samym poziomem początkowym, wydaje się, że stworzyłeś warunki wyścigu dla tych dwóch pakietów. Framework rozpoczyna rozwiązywanie i uruchamianie obu pakietów w tym samym czasie. Czasami udaje mu się uruchomić pakiet hosta, zanim proces rozstrzygania fragmentu zostanie zakończony -> wtedy metoda początkowa pakietu hostów zachowuje się tak, jakby żaden fragment nie był dostępny.

Co można zrobić, to np. aby dać fragmentowi wcześniejszy poziom początkowy niż pakiet hosta. Fragment powinien zostać rozwiązany i rozpocząć się pomyślnie, nawet jeśli pakiet hosta jeszcze się nie rozpoczął. Potrzebny jest tylko pakiet hosta do rozwiązania.

Możesz również przetestować to zachowanie w innych frameworkach OSGi - np. na ProSyst's mBedded Server (mBS) - Wiem, że jest w pełni zgodny ze specyfikacją OSGI 4.2, gdzie określono powyższe rozdzielanie fragmentów.

+0

Dziękujemy za wyjaśnienia! Niestety, to nie działa. Ustawiłem poziom felix.auto.start, aby fragment był mniejszy niż dla samego pakietu. Sprawdziłem to dwukrotnie w konsoli gogo - pakiet ma wyższy poziom niż fragment. Czuję, że poziom początkowy nie gwarantuje, że pakiet/fragment z niższym poziomem zakończy swoją rozdzielczość przed przejściem na wyższy poziom początkowy. – Kojotak

+4

To jest nieprawidłowe. Po pierwsze, fragment załącza się w momencie rozstrzygnięcia * hosta *. Po drugie, ramy nie rozwiązują się i zaczynają w tym samym czasie. W rzeczywistości uruchamianie nie ma żadnego wpływu na rozdzielczość, a fragmenty i tak nie mogą zostać uruchomione. –

Powiązane problemy