2010-02-04 5 views
29

Utilizzo OSGi da un po 'di tempo e ho varie soluzioni ai problemi riscontrati. Volevo rivisitare uno di questi e vedere se le persone avevano escogitato soluzioni diverse.Migliore gestione del thread Context ClassLoader in OSGi

Uno dei problemi più comuni che ho con OSGi (Equinox 3.4.2) è la frequente indisponibilità del contesto ClassLoader del thread. So che questo è in parte un problema di Equinox, ma ho riscontrato anche il problema con Felix. Incontro questo principalmente con le librerie di terze parti che iniziano i propri Thread o ThreadPools. Quando questi vengono avviati durante l'attivazione di Bundle o DS, possono finire senza il loro ClassLoader. Se la libreria di terze parti ha protezioni contro il contesto ClassLoader mancante, quindi nessun problema, ma non tutti lo controlla. Successivamente, se la suddetta libreria deve eseguire il caricamento dinamico delle classi, potrebbe esplodere.

Il linguaggio ho utilizzato per un po 'è il seguente (brevemente):

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

Questa eccedenza di solito finisce nella Attivatore o DS attivare metodo(). Ci sono alcune piccole variazioni dove controllo se tccl non è nullo e non sovrascrivo il classloader di contesto.

Ora, ho un po 'di codice intonacato in vari punti in cui so che alcune librerie di terze parti potrebbero generare una discussione e rovinare la mia giornata. Mentre all'inizio era gestibile, ho finito per avere questo in molti posti casuali e mi dà fastidio.

Chiunque soffra di questo problema e quali soluzioni hanno trovato? Vorrei anche avere un'idea di se questo problema è stato risolto nel nuovo Equinox 3.5.x e se qualcuno lo ha effettivamente visto funzionare?

Saluti.

risposta

12

Ottima domanda, abbiamo fatto lo stesso lavoro (in Felix/Karaf/Servicemix4.2) e abbiamo cercato una soluzione migliore. Ecco la risposta che ho ricevuto indietro dal team di Felix ...

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

In sostanza, dicono che non c'è una soluzione migliore in questo momento.

Tuttavia, io vedo che Equinox fa riferimento a alcune altre opzioni, tra cui "Politiche Buddy" e utilizzando un "Contesto Finder" qui ...

http://wiki.eclipse.org/Context_Class_Loader_Enhancements

Se qualcuno sa di altre opzioni o anche una tabella di marcia per risolvere questo problema in futuro, faccelo sapere ...

+0

Prima risposta in quasi un anno! +1 per quello. Ma sì, quello che il team Felix consiglia è quello che sto già facendo. Il Context Finder è arrivato con Equinox 3.6, quindi non era disponibile al momento della domanda. Tuttavia, avevo cercato di usare il Context Finder e ho scoperto che non sempre funziona. – omerkudat

+0

probabilmente hai ottenuto il badge "tumbleweed" almeno :) Non posso credere che non hai ricevuto alcuna risposta in quanto questo sembra essere un problema comune di OSGi ... –