BundleActivator,ManagedService和我的应用程序如何在启动/停止时进行交互?

时间:2012-09-15 00:19:02

标签: configuration osgi lifecycle

我有一个非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的更新()只是含糊不清的评论说'#34;从配置管理员应用配置"当它传递一个非空字典时。

那么我看这里:

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

在那里,似乎就像他们正在做我猜想的那样。他们似乎已将实际应用程序从BundleActivator移动到ManagedService,并且正在处理在updated()接收非null配置时启动它,如果它已经启动则先停止它。

但是现在怎样才能调用BundleActivator的stop()?

回到上面提到的第一个示例页面,他们取消注册ManagedService。在第二个示例页面上,他们不会显示他们的行为。

所以我猜测可能取消注册ManagedService会导致将空配置发送到ManagedService.updated(),此时我可以中断app线程,等待它结束,然后返回?

我怀疑我完全不正确,但我不知道"真实"这样做的方法是。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

BundleActivator(BA)和ManagedService(MS)是您的捆绑包的回调。 BundleActivator用于捆绑包的活动状态。 BA.start是在你正在启动捆绑包时,BA.stop是在它被停止时。如果有MS,则会调用MS为您的软件包提供配置,或者通知您没有配置。

所以在BA.start中,您注册了MS服务并返回。当调用MS时(在其他某个线程上),您将收到您的配置或被告知没有配置,您可以采取相应的行动(启动应用程序等)

您也可以随时致电MS以获取有关修改或删除配置的建议,您应该采取相应措施(即调整您的应用行为)。

当你在BA.stop被叫时,你需要停止你的应用程序。您可以取消注册MS或让框架为您执行此操作,作为正常捆绑停止处理的一部分。