Лучшая обработка Thread Context ClassLoader в OSGi - PullRequest
29 голосов
/ 04 февраля 2010

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

Одна из наиболее распространенных проблем, с которыми я сталкиваюсь с OSGi (Equinox 3.4.2), - это частая недоступность контекста потока ClassLoader.Я знаю, что это частично проблема Равноденствия, но я столкнулся с проблемой и с Феликсом.Я сталкиваюсь с этим в основном со сторонними библиотеками, которые запускают свои собственные 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 activ ().В некоторых незначительных вариациях я проверяю, является ли tccl ненулевым, и не перезаписываю загрузчик классов контекста.

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

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

С уважением.

1 Ответ

13 голосов
/ 19 января 2011

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

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

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

Однако я вижу, что Equinox ссылается на некоторые другие опции, включая «Политику друзей» и использование «Средство поиска контекста» здесь ...

http://wiki.eclipse.org/Context_Class_Loader_Enhancements

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

...