1

非 OSGi アプリケーションがありました。これを OSGi に変換するために、最初にバンドルして、単純な BundleActivator を与えました。アクティベーターの start() は、以前はアプリの main() であった (そして現在は Runnable である) スレッドを開始し、そのスレッドを記憶しました。アクティベーターの stop() はそのスレッドを中断し、(join() を介して) スレッドが終了するのを待ってから戻りました。これはすべて正常に機能しているように見えました。

OSGiification プロセスの次のステップとして、アプリケーションが使用していたプロパティ ベースの構成ではなく、OSGi 構成管理を使用しようとしています。そのため、Activator に加えて ManagedService を追加しています。

しかし、アプリケーションをどのように開始および停止するべきかは、もはや明確ではありません。私が見た例は、私を混乱させるだけです。具体的には、次のとおりです。

http://felix.apache.org/site/apache-felix-config-admin.html

BundleActivator.start() でアプリケーションを実際に起動しているようには見えなくなりました。代わりに、ManagedService を登録して構成を受け取るだけです。それで、ManagedService で、構成を受け取ったときにアプリのメイン スレッドを起動するのではないでしょうか。彼らはそれを示していません-ManagedServiceのupdated()には、null以外の辞書が渡されたときに「構成管理者から構成を適用する」という漠然としたコメントがあります。

それで、私はここを見ます:

http://blog.osgi.org/2010/06/how-to-use-config-admin.html

そこでは、おそらく彼らは私が推測したことをしているようです彼らは実際のアプリを BundleActivator から ManagedService に移動したようで、updated() が null 以外の構成を受け取ったときにそれを開始し、既に開始されている場合は最初に停止することを扱っています。

しかし、BundleActivator の stop() が呼び出されたときはどうなるでしょうか。

上記の最初のサンプル ページに戻ると、ManagedService の登録が解除されます。2 番目の例のページでは、それらが何をするかを示していません。

したがって、ManagedService の登録を解除すると、null 構成が ManagedService.updated() に送信され、その時点でアプリ スレッドを中断し、それが終了するのを待ってから戻ることができると思いますか?

私は完全に間違っていると思いますが、これを行う「本当の」方法が何であるかはわかりません。助けてくれてありがとう。

4

1 に答える 1

2

BundleActivator (BA) と ManagedService (MS) は、バンドルへのコールバックです。BundleActivator は、バンドルのアクティブ状態用です。BA.start はバンドルが開始されているとき、BA.stop は停止されているときです。MS が呼び出されて、バンドルに構成があればそれを提供するか、構成がないことを通知します。

したがって、BA.start では、MS サービスを登録して戻ります。MS が (他のスレッドで) 呼び出されると、構成を受け取るか、構成がないと通知され、それに応じて行動することができます (アプリの起動など)。

MS は、設定の変更または削除についてアドバイスを受けるためにいつでも呼び出される可能性があり、それに応じて行動する必要があります (つまり、アプリの動作を調整します)。

BA.stop で呼び出されたら、アプリを停止する必要があります。MS の登録を解除するか、通常のバンドル停止処理の一部としてフレームワークに任せることができます。

于 2012-09-15T10:54:23.880 に答える