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

Posted

技术标签:

【中文标题】在 OSGi 中更好地处理线程上下文类加载器【英文标题】:Better handling of Thread Context ClassLoader in OSGi 【发布时间】:2011-01-13 00:35:41 【问题描述】:

我使用 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 中得到解决,是否有人真正看到它工作?

问候。

【问题讨论】:

这一年是两千二十。我也一直在寻找解决方案。也许第二个不被接受的解决方案会有所帮助? ***.com/questions/37948303/… 【参考方案1】:

很好的问题,我们一直在做同样的工作(在 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

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

【讨论】:

近一年来的第一个答案!为此+1。但是,是的,Felix 团队推荐的是我已经在做的事情。上下文查找器随 Equinox 3.6 一起提供,因此在提出问题时它不可用。但是,我曾尝试使用 Context Finder,但发现它并不总是有效。 您可能至少从中得到了“风滚草”徽章 :) 不敢相信您没有得到任何回应,因为这似乎是一个常见的 OSGi 问题...

以上是关于在 OSGi 中更好地处理线程上下文类加载器的主要内容,如果未能解决你的问题,请参考以下文章

JVM -- 类加载器;双亲委派机制;线程上下文类加载器

JVM 类加载

类加载器

类加载器

JAVA基础_类加载器

java 编程基础 加载器