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

35

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

我在OSGi(Equinox 3.4.2)中最常遇到的问题之一是Thread的上下文ClassLoader频繁不可用。我知道这部分是Equinox的问题,但我也遇到了Felix的问题。我主要遇到这个问题是因为第三方库启动了自己的线程或线程池。当这些在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 的 activate() 方法中。有一些小的变化,我会检查 tccl 是否为非空并且不覆盖上下文类加载器。

现在,我将这段代码放置在各种地方,我知道某些第三方库可能会创建线程并毁掉我的一天。虽然一开始还可以管理,但最终我在许多随机位置都要用到它,这让我很烦恼。

是否有其他人遇到过这个问题,他们有什么解决方案?我也想了解一下这个问题是否已经在新的 Equinox 3.5.x 中得到解决,以及是否有人真正看到它起作用?

谢谢。


这一年是2020年。我一直在寻找解决方案。也许第二个未被接受的解决方案会有所帮助? https://stackoverflow.com/questions/37948303/opensaml3-resource-not-found-default-config-xml-in-osgi-container - Cris Rockwell
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引用了其他选项,包括“Buddy Policies”和在此处使用“Context Finder”...

http://wiki.eclipse.org/Context_Class_Loader_Enhancements

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


第一次近一年的回答!为此加1分。但是,Felix团队建议的正是我已经在做的事情。Context Finder是随着Equinox 3.6一起推出的,因此在提问时还不可用。然而,我尝试使用了Context Finder,并发现它并不总是有效。 - omerkudat
你可能至少获得了“飞絮”徽章 :) 真不敢相信你没有得到任何回应,因为这似乎是一个常见的OSGi问题... - Ben ODay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接