1

Equinox OSGI フレームワークで無限ループで実行されているバンドルがあります。このバンドルが原因で、フレームワークを再度実行したときに新しいバンドルを開始できません。この状況でこのバンドルを停止するにはどうすればよいですか?

フレームワークを開始するために入力するコマンドは次のとおりです。

java -jar org.eclipse.osgi_3.9.0.v20130529-1710.jar -console

このメッセージが無限に表示されます。

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
...........

この質問に答えると、メソッドの実行中に OSGI バンドルを停止する方法と、それが許可されているかどうかの回答にも役立ちます。

4

1 に答える 1

2

バンドルがそのBundleActivator.startメソッドで無限ループに入ったため、OSGi コールバックが拘束されたと思います。明らかに、これはあなたがすべきことではありません!! おそらく強制的に JVM をシャットダウンするしかありません。

ここでの問題は、次に OSGi を起動したときにバンドルが自動的に再起動されないようにすることです。これを確実にする最も簡単な方法は、OSGi が前回の実行時に開始されたバンドルのリストを記憶している「ストレージ」ディレクトリを削除することです。残念ながら、ストレージ ディレクトリの場所は構成プロパティの影響を受けており、OSGi の構成方法を指定していません。Equinox のデフォルトは ですconfiguration/org.eclipse.osgi。削除してみてください。で実行することもできます-clean

メソッドの実行中に OSGi バンドルを停止する方法については、もちろんバンドルを停止することができ、これによりそのstopメソッドが実行されます。そのメソッドで好きなことを行うことができます。一般に、startメソッドで作成したものはすべてクリーンアップすることを目指す必要があります。ただし、ランナウェイ スレッドがある場合は、基本的に何もできません。Java はスレッドを強制終了する方法を提供していないため、協調interrupt的な方法しか提供していません。

OSGi は Java の基本的なルールを変更することはできません。そのため、ランナウェイ スレッドは、他の Java アプリケーションと同じように OSGi でも問題になります。

于 2013-07-23T20:09:47.560 に答える