私はしばらく OSGi を使用してきましたが、遭遇した問題に対してさまざまな解決策を持っています。そのうちの 1 つを再検討して、他のユーザーが別の解決策を思いついたかどうかを確認したいと思いました。
OSGi (Equinox 3.4.2) で私が抱える最も一般的な問題の 1 つは、スレッドのコンテキスト ClassLoader が頻繁に利用できなくなることです。これは部分的に Equinox の問題であることはわかっていますが、Felix でも同じ問題に遭遇しました。この問題は、独自のスレッドまたは ThreadPool を開始するサードパーティ ライブラリで主に発生します。これらがバンドルまたは 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() メソッドで実行されます。nulltccl
でないかどうかをチェックし、コンテキスト クラスローダーをオーバーライドしないという、いくつかの小さなバリエーションがあります。
現在、このコードをさまざまな場所に貼り付けていますが、サードパーティのライブラリがスレッドを生成して私の一日を台無しにする可能性があるとわかっています。最初は管理できましたが、最終的にはこれがさまざまな場所に存在し、煩わしくなっています。
この問題に悩まされている人は他にいますか?また、どのような解決策を思いつきましたか?また、この問題が新しい Equinox 3.5.x で解決されているかどうか、また実際に解決した人がいるかどうかも知りたいです。
よろしくお願いいたします。
ベストアンサー1
素晴らしい質問です。私たちも (Felix/Karaf/Servicemix4.2 で) 同じ作業を行っており、より良い解決策を探していました。以下は、Felix チームから返ってきた回答です...
基本的に、現時点ではこれより良い解決策はないと言われています。
ただし、Equinox では「Buddy ポリシー」や「Context Finder」の使用など、他のオプションも参照していることがわかります...
http://wiki.eclipse.org/Context_Class_Loader_Enhancements
将来的にこの問題を解決するための他のオプションやロードマップをご存知の方がいらっしゃいましたら、ぜひお知らせください...