如何立即获取 ManagedService 配置?

发布于 2024-12-07 15:01:25 字数 761 浏览 0 评论 0原文

我正在使用 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同步吗? (从源代码和 托管服务 javadoc。)

I'm using the Felix Configuration Admin library to read and apply configuration files for OSGi services. Many of the services I'm configuring are third-party (e.g. org.ops4j.pax.web.pax-web-jetty and org.ops4j.pax.url.mvn) and use a simple BundleActivator rather than Declarative Services. I've found that those services are each initialized twice because

  1. on activation they call ManagedService#updated(null), and
  2. a very short while later, the Felix ConfigurationManager.UpdateThread calls ManagedService#update(non-null) asynchronously.

I hate this delay for getting my configuration applied. It causes erratic failures due to the inherent race condition. Is there an alternative CM implementation that can apply configurations synchronously to avoid this problem? Or can I make Felix be synchronous? (It looks like no, from inspection of the source code and the ManagedService javadoc.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

楠木可依 2024-12-14 15:01:25

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

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

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

Actually the callback to update() from another thread is a requirement of the Config Admin specification. See section 104.5.3 of the R4 Compendium Spec:

The updated(Dictionary) callback from the Configuration Admin service to the Managed Service must take place asynchronously. This requirement allows the Managed Service to finish its initialization in a synchronized method without interference from the Configuration Admin service call- back.

Unfortunately this means you need to code your ManagedService to not have erratic failures or inherent race conditions. For example, if registering as a service under another interface besides ManagedService, wait until the non-null update has been received before registering it under that interface.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文