在 OSGi 中更好地处理线程上下文类加载器
我已经使用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中得到解决,以及是否有人真正看到它的工作原理?
问候。