我正在使用Felix Configuration Admin库来读取和应用OSGi服务的配置文件。我正在配置的许多服务都是第三方(例如 org.ops4j.pax.web.pax-web-jetty 和 org.ops4j.pax.url.mvn )并使用简单的BundleActivator
而不是声明式服务。我发现这些服务都是初始化两次,因为
ManagedService#updated(null)
和ConfigurationManager.UpdateThread
异步调用ManagedService#update(non-null)
。我讨厌让我的配置得到应用的延迟。由于固有的竞争条件,它会导致不稳定的故障。是否有可以同步应用配置以避免此问题的替代CM实现?或者我可以让Felix同步吗? (看起来没有,从检查源代码和ManagedService javadoc。)
答案 0 :(得分:3)
实际上,从另一个线程回调update()
是Config Admin规范的要求。参见R4 Compendium Spec的第104.5.3节:
从Configuration Admin服务到托管服务的更新(字典)回调必须异步进行。此要求允许托管服务以同步方法完成初始化,而不会受到Configuration Admin服务回调的干扰。
不幸的是,这意味着您需要将您的ManagedService编码为而不是有不稳定的失败或固有的竞争条件。例如,如果在ManagedService
之外的另一个接口下注册为服务,请等到收到非空update
,然后在该接口下注册它。