2010-02-04 11 views
29

He estado usando OSGi por un tiempo y tengo varias soluciones a los problemas que he encontrado. Quería volver a visitar uno de estos y ver si las personas habían encontrado diferentes soluciones.Mejor manejo de Thread Context ClassLoader en OSGi

Uno de los problemas más comunes que tengo con OSGi (Equinox 3.4.2) es la indisponibilidad frecuente del ClassLoader de contexto del Thread. Sé que esto es en parte un problema de Equinox, pero también he encontrado el problema con Félix. Encuentro esto principalmente con bibliotecas de terceros que inician sus propios Threads o ThreadPools. Cuando se inician durante la activación de Bundle o DS, pueden terminar sin su ClassLoader. Si la biblioteca de terceros tiene guardias contra el contexto que falta ClassLoader, entonces no hay problema, pero no todos lo verifican. Más tarde, si dicha biblioteca necesita hacer una carga dinámica de clases, podría explotar.

El idioma He estado usando durante un tiempo es la siguiente (brevemente):

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

Este idioma general termina en el activador o los DS activar método(). Hay algunas variaciones menores donde compruebo si tccl no es nulo y no anulo el cargador de clases de contexto.

Ahora, tengo un código enyesado en varios lugares donde sé que una biblioteca de terceros podría engendrar un hilo y arruinar mi día. Si bien fue manejable al principio, he terminado teniendo esto en muchos lugares al azar y me está molestando.

¿Alguien más está sufriendo este problema y qué soluciones han ideado? También me gustaría tener una idea de si este problema está resuelto en el nuevo Equinox 3.5.x, y si alguien realmente lo ha visto funcionar.

Atentamente.

Respuesta

12

Una gran pregunta, hemos estado haciendo el mismo trabajo (en Felix/Karaf/Servicemix4.2) y hemos estado buscando una solución mejor. Aquí está la respuesta que regresé del equipo Felix ...

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

En esencia, dicen que no hay una mejor solución en este momento.

Sin embargo, yo veo que Equinox hace referencia a algunas otras opciones que incluyen "Políticas de compañeros" y el uso de un "contexto Finder" aquí ...

http://wiki.eclipse.org/Context_Class_Loader_Enhancements

Si alguien sabe de otras opciones o incluso una hoja de ruta para resolver esto en el futuro, háganos saber ...

+0

¡Primera respuesta en casi un año! +1 por eso. Pero sí, lo que el equipo de Felix recomienda es lo que ya estoy haciendo. El Context Finder llegó con Equinox 3.6, por lo que no estaba disponible en el momento de la pregunta. Sin embargo, traté de usar Context Finder y descubrí que no siempre funciona. – omerkudat

+0

es probable que tenga al menos la insignia "tumbleweed" :) no puedo creer que no haya recibido ninguna respuesta, ya que parece ser un problema OSGi común ... –