2010-02-04 6 views
29

Я использую OSGi какое-то время, и у меня есть различные решения проблем, с которыми я столкнулся. Я хотел пересмотреть один из них и посмотреть, придумали ли люди разные решения.Лучшая обработка потокового контекста ClassLoader в OSGi

Одной из наиболее распространенных проблем, с которыми я сталкиваюсь в OSGi (Equinox 3.4.2), является частая недоступность контекста ThreadLame ClassLoader. Я знаю, что это частично проблема Equinox, но я столкнулся с проблемой и с Феликс. Я встречаю это в основном с сторонними библиотеками, которые запускают свои собственные Threads или ThreadPools. Когда они запускаются во время активации Bundle или DS, они могут закончиться без своего ClassLoader. Если в сторонней библиотеке есть защита от недопустимого контекста ClassLoader, тогда проблем нет, но не все проверяют. Позже, если упомянутая библиотека должна выполнять динамическую загрузку классов, она может взорваться.

идиома Я использую некоторое время следующий (кратко):

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

Эта идиома обычно заканчивается в активаторе или DS активации() метод. Есть некоторые незначительные вариации, в которых я проверяю, является ли tccl непустым, и я не переопределяю загрузчик классов.

Теперь у меня есть эта часть кода, оштукатуренная в разные места, где я знаю, что какая-то сторонняя библиотека может породить нить и разрушить мой день. В то время как это было управляемо сначала, я закончил иметь это во многих случайных местах, и это беспокоит меня.

Кто-нибудь еще страдает от этой проблемы и какие решения они придумали? Я также хотел бы получить представление о том, разрешена ли эта проблема в новом Equinox 3.5.x, и видел ли кто-нибудь ее работу?

С уважением.

ответ

12

Отличный вопрос: мы работали в одном месте (в Felix/Karaf/Servicemix4.2) и искали лучшее решение. Вот ответ, который я вернулся из команды Феликса ...

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

По существу, они говорят, что это не лучшее решение на данный момент.

Однако я вижу, что Equinox ссылается на какие-то другие варианты, в том числе «Buddy политики» и с помощью «Контекст Finder» здесь ...

http://wiki.eclipse.org/Context_Class_Loader_Enhancements

Если кто-нибудь знает другие варианты или даже дорожную карту для решения этого вопроса в будущем, пожалуйста, сообщите нам ...

+0

Первый ответ в течение почти одного года! +1 для этого. Но да, то, что команда Felix рекомендует, это то, что я уже делаю. Context Finder прибыл с Equinox 3.6, поэтому он не был доступен во время вопроса. Тем не менее, я пытался использовать Context Finder, и я узнал, что он не всегда работает. – omerkudat

+0

у вас наверняка есть значок «перекати-поле» из-за этого :) не могу поверить, что вы не получили никаких ответов, поскольку это похоже на общую проблему OSGi ... –

Смежные вопросы