代码之家  ›  专栏  ›  技术社区  ›  omerkudat

osgi中线程上下文类加载器的更好处理

  •  29
  • omerkudat  · 技术社区  · 15 年前

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

    osgi(equinox 3.4.2)最常见的问题之一是线程的上下文类加载器经常不可用。我知道这部分是春分问题,但我也遇到了费利克斯的问题。我遇到这种情况主要是第三方库启动自己的线程或线程池。当这些在bundle或ds激活期间启动时,它们可能会在没有类加载器的情况下结束。如果第三方库有保护措施防止上下文类加载器丢失,那么没问题,但不是所有人都检查它。稍后,如果所述库需要进行动态类加载,则可能会爆炸。

    我用了一段时间的成语如下(简单地说):

    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 不为空并且我不重写上下文类加载器。

    现在,我有一点代码贴到不同的地方,我知道一些第三方图书馆可能会产生一个线程和破坏我的一天。虽然一开始是可以处理的,但我最终在许多随机的地方遇到了这个问题,这让我很困扰。

    有没有其他人受到这个问题的困扰,他们有什么解决办法?我也想知道这个问题是否在新的春分点3.5.x中得到解决,以及是否有人真正看到了它的工作?

    当做。

    1 回复  |  直到 13 年前
        1
  •  13
  •   Ben ODay    14 年前

    很好的问题,我们一直在做同样的工作(在felix/karaf/servicemix4.2中),并且一直在寻找更好的解决方案。这是我从费利克斯小组得到的回复…

    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

    如果有人知道未来解决这个问题的其他选择甚至路线图,请告诉我们…