Подтвердить что ты не робот

Лучшая обработка контекстного класса ClassLoader в OSGi

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

Одной из наиболее распространенных проблем с OSGi (Equinox 3.4.2) является частая недоступность контекста ThreadLoad 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);
}

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

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

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

С уважением.

4b9b3361

Ответ 1

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

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

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

Тем не менее, я вижу, что Equinox ссылается на другие параметры, включая "Buddy Policies" и используя "Контекстный поиск" здесь...

http://wiki.eclipse.org/Context_Class_Loader_Enhancements

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