2011-09-30 68 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服務之前它被配置。 –