非 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() に送信され、その時点でアプリ スレッドを中断し、それが終了するのを待ってから戻ることができると思いますか?
私は完全に間違っていると思いますが、これを行う「本当の」方法が何であるかはわかりません。助けてくれてありがとう。