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() 在传递非空字典时只是有模糊的评论说“从配置管理员应用配置”。

那么我看这里:

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

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

但是现在调用 BundleActivator 的 stop() 时呢?

回到我上面提到的第一个示例页面,他们取消注册 ManagedService。在第二个示例页面上,他们没有显示他们做了什么。

所以我猜也许注销ManagedService会导致空配置被发送到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 回答