35

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

我对 OSGi (Equinox 3.4.2) 最常见的问题之一是线程的上下文类加载器经常不可用。我知道这部分是 Equinox 问题,但我也遇到了 Felix 的问题。我主要是在启动自己的线程或线程池的 3rd 方库中遇到这种情况。当这些在 Bundle 或 DS 激活期间启动时,它们可能会在没有 ClassLoader 的情况下结束。如果 3rd 方库有防止上下文 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不为空,并且我不会覆盖上下文类加载器。

现在,我将这段代码贴在各个地方,我知道一些 3rd 方库可能会产生一个线程并毁了我的一天。虽然起初它是可以管理的,但我最终在许多随机的地方都有这个,这让我很困扰。

还有其他人遭受这个问题的困扰,他们提出了哪些解决方案?我还想知道这个问题是否在新的 Equinox 3.5.x 中得到解决,是否有人真正看到它工作?

问候。

4

1 回答 1

15

很好的问题,我们一直在做同样的工作(在 Felix/Karaf/Servicemix4.2 中)并且一直在寻找更好的解决方案。这是我从 Felix 团队收到的回复……

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

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

于 2011-01-18T21:31:44.373 回答