我有一个非 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(),此时我可以中断应用程序线程,等待它结束,然后返回?
我怀疑我完全不正确,但我不知道这样做的“真正”方法是什么。提前感谢您的帮助。