3

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

  1. 在激活时他们调用ManagedService#updated(null),并且
  2. 不久之后,Felix异步ConfigurationManager.UpdateThread调用。ManagedService#update(non-null)

我讨厌这种延迟应用我的配置。由于固有的竞争条件,它会导致不稳定的故障。是否有可以同步应用配置以避免此问题的替代 CM 实现?或者我可以让 Felix 同步吗?(从对源代码和ManagedService javadoc的检查来看,似乎没有。)

4

1 回答 1

4

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

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

不幸的是,这意味着您需要对 ManagedService 进行编码,以免出现不稳定的故障或固有的竞争条件。例如,如果在除 之外的另一个接口下注册为服务ManagedService,则等到update收到非空值后再在该接口下注册。

于 2011-10-01T00:26:33.483 回答