【发布时间】: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 中得到解决,是否有人真正看到它工作?
问候。
【问题讨论】:
-
这一年是两千二十。我也一直在寻找解决方案。也许第二个不被接受的解决方案会有所帮助? stackoverflow.com/questions/37948303/…