我已经使用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 中得到解决,以及是否有人真正看到它起作用?
谢谢。