3

BundleActivatorがバックグラウンドスレッドを実行し、そのバックグラウンドスレッドに回復不能なエラーが発生した場合はどうすればよいですか?

public class Activator implements BundleActivator
{
   private Thread t;
   @Override
   public void start(BundleContext context) throws Exception
   {
      t = new Thread(new Runnable(){
            @Override
             public void run(){
                while (!Thread.interrupted()){
                  // do something which may throw a runtime exception
               }
            }
         });
      t.start();
   }
   @Override void stop(BundleContext context) throws Exception
   {
      t.interrupt();
      t.join();
   }
}

この例では、スレッドが停止し、バンドルが効果的に停止されて実行されていないことをOSGiフレームワークに通知するにはどうすればよいですか?

4

4 に答える 4

2

この記事で、PeterKriensがどのように同様のアクションを実行するかを見てください。彼の例で行う必要があるのは、printStackTraceを実行する代わりに、catchブロックのアクティベーターで停止を呼び出すことだけです。

于 2013-01-09T22:23:53.183 に答える
2

おそらく最善の方法は、できれば OSGi Log Service にエラーを記録することです。その後、管理者はバンドルの問題を検出し、何をすべきかを決定できます。これを としてではなく、Declarative Services コンポーネントとして実装する必要があります。これBundleActivatorにより、Log Service へのアクセスがはるかに簡単になり、バンドルにこれらのものを複数含めることもできます。

バンドルがそれ自体を停止しようとするべきではないと思います。これにより、バンドルが奇妙な状態になります...停止されていますが、まだコードが実行されています...つまり、を呼び出したコードですstop()。これはほんの短い期間かもしれませんが、間違っていると感じています。

ACTIVE 状態のバンドルは、必ずしも常に「何かを実行中」である必要はありません。「何かを実行する」可能性があるだけです。何かが失敗したという事実は、バンドルの外部状態に実際に影響を与えるべきではありません。

于 2013-01-10T17:27:16.160 に答える
1

ニールは(いつものように)非常に正しい。管理エージェントに干渉するため、バンドル自体が停止することはありません。開始/停止は、この管理エージェントからバンドルがアクティブであることを伝えるメッセージです。バンドルがその責任を果たせない場合は、メッセージをログに記録し、少し (徐々に長く) 待ってから再試行してください。

ログは通知する場所です。バンドルを停止すると、レベルがひどく混ざります。

于 2013-01-11T07:20:19.863 に答える
1

私の知る限り、OSGi はこの特定の状況で直接あなたを助けることはできません。私は通常、キャッチされていない例外ハンドラーを使用してスレッド クラッシュの通知を受け取るか、なんらかの形式の SW ウォッチドッグを実装しています。

ポイントは、複数のスレッドを生成し、開始メソッドを正常に完了するバンドルは、これらのスレッドの 1 つがしばらくしてクラッシュした場合でも、ACTIVE のままであるということです。

于 2013-01-09T22:12:51.220 に答える