2009-10-14 70 views
0

我有一个使用OSGi进行生命周期和依赖管理的模块化应用程序。但是,例如,某些软件包需要一段时间才能启动,因为它们必须从某处获取数据。另外,它们可能无法在配置更新期间处理某些调用,例如,保持与db的连接的包在更新连接参数时无法发送查询。如何扩展/修改OSGi生命周期管理?

因此,在我看来,一束可以比OSGi容器管理的状态更微妙的状态,并且因为它们影响包交互,所以需要进行一些处理。我可以看到这样做的三个基本策略:

  • 螺丝微妙,并且例如把所有初始化代码放入BundleActivator.start()。如果获取这些数据需要花费很长时间,那么捆绑就不会永远开始。我不能100%确定这会覆盖所有情况,而且看起来有点不对。
  • 使我的包与一个额外的事件系统,他们用来通知对方更微妙的状态,如“暂时不可用”或“真正准备好”。这可能只是不必要的开销。
  • 让这个捆绑包保持其对自身更细微的状态更改,并且只需接受调用,并在必要时在内部推迟它们。当调用者实际上可以更好地处理不可用性时,这可能不合适。

你有什么一般的建议吗? OSGi中有甚么可以使用的东西?

回答

0

尝试使用服务和服务跟踪器在包之间进行通信。这也有助于解耦您的捆绑包,因为您可能会使用接口。

使用您例如束进行对话的一个数据库:

  1. Activator.start(),启动一个后台线程做你initization业务。激活者应该快速执行。
  2. 注册一个为其他包提供所需数据库相关抽象的服务。
  3. 其他软件包创建服务跟踪器以查找他们需要的服务,
  4. 其他软件包仅在第一个软件包注册服务时才在服务跟踪器中获得回调。第一个bundle只在服务准备就绪时注册,意味着其他bundle可以立即开始使用它。
+0

因此,在(2)/(4)中的注册将不会从Activator.start()中完成,而是从在(1)中启动的后台线程中完成? – 2009-10-14 14:28:03

+0

您可以从任何地方进行注册/跟踪 – basszero 2009-10-15 18:57:56