2010-02-04 16 views
29

Używam OSGi już od jakiegoś czasu i mam różne rozwiązania napotkanych problemów. Chciałem wrócić do jednego z nich i zobaczyć, czy ludzie wymyślili różne rozwiązania.Lepsza obsługa wątku Kontekst ClassLoader w OSGi

Jedną z najczęstszych problemów z OSGi (Equinox 3.4.2) jest częsta niedostępność kontekstu wątku ClassLoader. Wiem, że to po części problem z Equinoxem, ale też spotkałem się z problemem Felixa. Znam to głównie z bibliotekami stron trzecich, które uruchamiają własne wątki lub wątki. Gdy są one uruchamiane podczas aktywacji Paczki lub DS, mogą zakończyć się bez swojej ClassLoader. Jeśli biblioteka innej firmy ma zabezpieczenia przeciwko kontekstowemu brakowi ClassLoader, to nie ma problemu, ale nie każdy to sprawdza. Później, jeśli wspomniana biblioteka będzie wymagać dynamicznego ładowania klasowego, może się ona wysadzić w powietrze.

Idiom, które były używane przez pewien czas jest następujący (w skrócie):

ClassLoader tccl = Thread.currentThread().getContextClassLoader(); 
try { 
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); 
    /* 
    * Start threads, or establish connections, here, now 
    */ 
} finally { 
    Thread.currentThread().setContextClassLoader(tccl); 
} 

idiom ten zwykle kończy się w aktywatorze lub DS aktywacji sposobu(). Istnieją pewne drobne odmiany, w których sprawdzam, czy tccl nie ma wartości null i nie zastępuję programu ładującego klasy context.

Teraz mam trochę kodu przyklejonego w różnych miejscach, gdzie wiem, że jakaś trzecia biblioteka może utworzyć wątek i zrujnować mi dzień. Choć początkowo było to łatwe do opanowania, skończyło się to w wielu przypadkowych miejscach i denerwuje mnie.

Ktoś, kto cierpi na tę chorobę i jakie rozwiązania wymyślił? Chciałbym również dowiedzieć się, czy problem został rozwiązany w nowym Equinox 3.5.x i czy ktokolwiek faktycznie to widział?

Pozdrawiam.

Odpowiedz

12

Świetne pytanie, robimy to samo dookoła (w Felix/Karaf/Servicemix4.2) i szukaliśmy lepszego rozwiązania. Oto odpowiedź, że wróciłem z zespołu Felix ...

http://old.nabble.com/Can-the-thread-context-classloader-issue-be-solved-at-all--td28260809.html#a30704352

Zasadniczo, mówią, że nie jest lepszym rozwiązaniem w tym momencie.

Jednak widzę, że Equinox odwołuje kilka innych opcji, w tym „Buddy w zasadach” i używając „context Finder” tutaj ...

http://wiki.eclipse.org/Context_Class_Loader_Enhancements

Jeśli ktoś wie o innych opcji, a nawet mapy drogowej aby rozwiązać ten problem w przyszłości, proszę dać nam znać ...

+0

Pierwsza odpowiedź od prawie roku! +1 za to. Ale tak, co zespół Felix poleca, to to, co już robię. Context Finder przybył z Equinox 3.6, więc nie był dostępny w momencie pytania. Jednak próbowałem użyć Wyszukiwarki kontekstów i odkryłem, że nie zawsze działa. – omerkudat

+0

Prawdopodobnie dostałeś od niego znaczek "tumbleweed" :) nie możesz uwierzyć, że nie dostałeś odpowiedzi, ponieważ wydaje się, że jest to typowy problem OSGi ... –