如何立即获得ManagedService配置?

时间:2011-09-30 21:29:51

标签: java configuration osgi apache-felix

我正在使用Felix Configuration Admin库来读取和应用OSGi服务的配置文件。我正在配置的许多服务都是第三方(例如 org.ops4j.pax.web.pax-web-jetty org.ops4j.pax.url.mvn )并使用简单的BundleActivator而不是声明式服务。我发现这些服务都是初始化两次,因为

  1. 在激活时,他们会调用ManagedService#updated(null)
  2. 很久以后,Felix ConfigurationManager.UpdateThread异步调用ManagedService#update(non-null)
  3. 我讨厌让我的配置得到应用的延迟。由于固有的竞争条件,它会导致不稳定的故障。是否有可以同步应用配置以避免此问题的替代CM实现?或者我可以让Felix同步吗? (看起来没有,从检查源代码和ManagedService javadoc。)

1 个答案:

答案 0 :(得分:3)

实际上,从另一个线程回调update()是Config Admin规范的要求。参见R4 Compendium Spec的第104.5.3节:

  

从Configuration Admin服务到托管服务的更新(字典)回调必须异步进行。此要求允许托管服务以同步方法完成初始化,而不会受到Configuration Admin服务回调的干扰。

不幸的是,这意味着您需要将您的ManagedService编码为而不是有不稳定的失败或固有的竞争条件。例如,如果在ManagedService之外的另一个接口下注册为服务,请等到收到非空update,然后在该接口下注册它。

相关问题