【问题标题】:Dynamism of services when using Aries blueprint使用 Aries 蓝图时服务的动态性
【发布时间】:2026-01-27 18:10:02
【问题描述】:

我正在我的 OSGI 应用程序中构建一个缓存系统,我最初的想法是,好的,当注册服务时我想应用缓存,我只是代理该服务并注册具有非常高服务排名的代理。

这几乎可以正常工作,具体取决于我的捆绑包的启动顺序。 如果消费者最后启动一切正常,而且如果我停止缓存包,消费者将回退到原始实现但是如果我重新启动缓存包,那么消费者不会获得代理版本服务。

为了举一个简单的例子来证明这一点,我制作了一个简单的捆绑包,它手动注册了一个排名更高的已知服务(即不创建代理等),当更高排名的服务启动时问题仍然存在消费者仍然使用排名较低的服务。

蓝图的活力是否只适用于某些情况?

  1. 初始接线 -> 选择排名最高的服务
  2. 当有线服务消失时 -> 选择排名最高的服务
  3. 当出现新服务时 -> 什么都不做

有什么方法可以在 3:d 的情况下获得 1 和 2 的行为?

或者有没有更好的方法来完成我想要做的事情? IE。与 HookEvent 或类似?

谢谢

编辑: 我通过在代理注册后更新使用的捆绑包解决了这个特殊问题,这似乎更新了服务线路。

Bundle[] usingBundles = reference.getUsingBundles();
for(.....)
{
   b.update();
}

【问题讨论】:

    标签: dynamic osgi blueprint-osgi


    【解决方案1】:

    嗯,服务排名只在找服务的时候有效。也就是说,您可能需要一些其他方式来通知您的消费包,您正在寻找的服务又回来了,并带有缓存功能。您可以在注册专门的代理服务时尝试触发特殊事件,并在您的服务消费者捆绑包中使用这些事件。如果看到这些事件,则对喜欢的服务进行“重新绑定”。尽管所有这些可能需要的不仅仅是蓝图 xml。

    【讨论】: