Лучшая обработка Thread Context ClassLoader в OSGi

Я уже некоторое время использую 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 ответ

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

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

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

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

http://wiki.eclipse.org/Context_Class_Loader_Enhancements

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

Другие вопросы по тегам