2011-09-30 74 views
2

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

  1. 他们打电话ManagedService#updated(null)激活和
  2. 很短的一会儿,菲利克斯ConfigurationManager.UpdateThread调用ManagedService#update(non-null)异步。

我讨厌这个延迟让我的配置适用。由于固有的竞争条件,它会导致错误的失败。是否有替代CM实现可以同步应用配置以避免此问题?或者我可以让Felix同步吗? (从源代码和ManagedService javadoc的检查看来,它看起来不是)。

回答

3

实际上,从另一个线程调用update()是Config Admin规范的要求。请参阅R4汇编规范的第104.5.3节:

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

不幸的是,这意味着你需要你的ManagedService代码来有不稳定的故障或固有的竞争条件。例如,如果在除ManagedService之外的另一个接口下注册为服务,请等到收到非空update后再将其注册到该接口下。

+0

谢谢尼尔,这非常有帮助。然而,这个建议有两个问题:1)我正在使用的代码不是我自己的代码,而是org.ops4j.pax库,所以我不能注入等待(或者我可以吗?)和2 )我怎么知道要等多久?这个问题在我的应用程序(https://issues.apache.org/jira/browse/KARAF-910)中导致了一个非常严重的故障,因为下游服务试图在使用注册的org.ops4j.pax.url.mvn服务之前它被配置。 –