【问题标题】:How can you get ManagedService configuration immediately?如何立即获得 ManagedService 配置?
【发布时间】:2011-09-30 21:29:50
【问题描述】:

我正在使用Felix Configuration Admin 库来读取和应用 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 来看,似乎没有。)

【问题讨论】:

    标签: java configuration osgi apache-felix


    【解决方案1】:

    实际上,从另一个线程回调到update() 是配置管理规范的要求。请参阅 R4 Compendium Spec 的第 104.5.3 节:

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

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

    【讨论】:

    • 谢谢尼尔,这很有帮助。但是,我对该建议有两个问题:1)我正在使用的代码不是我自己的,而是 org.ops4j.pax 库,所以我不能注入等待(或者我可以吗??),以及 2 ) 我怎么知道要等多久?这个问题在我的应用程序 (issues.apache.org/jira/browse/KARAF-910) 中造成了相当严重的故障,因为下游服务在配置之前尝试使用已注册的 org.ops4j.pax.url.mvn 服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多