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.
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
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 ... –