在 OSGi 中更好地处理线程上下文类加载器

2022-09-01 07:01:55

我已经使用OSGi一段时间了,对于我遇到的问题,我有各种解决方案。我想重新审视其中一个,看看人们是否提出了不同的解决方案。

我在OSGi(Equinox 3.4.2)中遇到的最常见问题之一是线程的上下文ClassLoader经常不可用。我知道这部分是一个Equinox问题,但我也遇到了Felix的问题。我主要在启动自己的线程或线程池的第三方库中遇到这种情况。当它们在捆绑包或 DS 激活期间启动时,它们最终可能会没有 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

现在,我有一段代码贴在各个地方,我知道一些第三方库可能会生成一个线程并毁了我的一天。虽然它最初是可控的,但我最终在许多随机的地方都有这种情况,这让我很困扰。

还有其他人遭受这个问题的困扰,他们想出了什么解决方案?我还想了解这个问题是否在新的Equinox 3.5.x中得到解决,以及是否有人真正看到它的工作原理?

问候。


答案 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”和在此处使用“Context Finder”......

http://wiki.eclipse.org/Context_Class_Loader_Enhancements

如果有人知道其他选项,甚至将来解决此问题的路线图,请告诉我们...


答案 2

推荐