Лучше обработка ClassLoder Контекста Потока в OSGi

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

Одной из наиболее распространенных проблем, которые я имею с OSGi (Равноденствие 3.4.2) является частая недоступность ClassLoder контекста Потока. Я знаю, что это - частично проблема Равноденствия, но я встретился с проблемой с Felix также. Я встречаюсь с этим главным образом со сторонними библиотеками, которые запускают их собственные Потоки или ThreadPools. Когда они запускаются во время Пакета или активации DS, они могут закончить без своего ClassLoder. Если сторонняя библиотека имеет, принимает меры против ClassLoder контекста, являющегося недостающим, то без проблем, но не все не проверяет его. Позже, если упомянутая библиотека должна сделать динамический classloading, она могла бы аварийно завершиться.

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

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 не является пустым, и я не переопределяю контекст classloader.

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

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

Отношения.

30
задан omerkudat 4 February 2010 в 10:33
поделиться