【问题标题】:Multiple references and dependencies with declarative services声明式服务的多个引用和依赖项
【发布时间】:2018-01-14 12:49:57
【问题描述】:

在通过 Karaf 使用 OSGi 声明式服务时,我遇到了加载顺序组件的问题。

我有这种情况:

@Component
public class A implements IA
{
  doSomething() {...}
}


@Component
public class B implements IB
{}

@Component
public class C implements IC
{
  @Reference 
  IA a

  @Reference 
  (cardinality = ReferenceCardinality.MULTIPLE,
   policyOption = ReferencePolicyOption.GREEDY,
   unbind = "doUnRegister" )
  void doRegister(IB b)
  {
    a.doSomething()
  }

  void doUnregister(IB b)
  {
    ...
  }
}

A、B 和 C 是三个不同的捆绑包。

当启动 Karaf 时,会注册一个 B 并调用 doRegister。但是:服务 A 尚未准备好(a 为空)。

我尝试了以下方法:

  1. 将 A 的起始级别设置为低于 B... 无效
  2. 在工作列表中提取 B 的注册,并在稍后激活 C 时实际使用 A。没用,代码很乱。
  3. 已通过 doRegister 上的注释寻找一种方法来编写此要求 - 不可能。
  4. 我尝试使用服务定位器并通过 C 上的 activate 方法获取上下文 - 不起作用,它使 Karaf 崩溃。

我肯定错过了什么,有没有人遇到过类似的问题并找到了解决方案?

更新: 参考 A a 更改为 IA a。添加了关于参考 B() 的遗忘信息。

【问题讨论】:

  • 您的示例课程是否完整?是否可能 B 实现和接口而 A 没有?
  • 感谢您的指出。但是是的,A、B 和 C 由接口支持,问题仍然存在。
  • 你能把一个完整的小例子发到 github 或类似网站吗?
  • 这个例子是一个更大的代码库的一部分,所以我在提炼这个例子时遇到了一些问题。
  • 你确定这是正确的吗?当您注入未注册为服务的 A 和 B 时,服务将注册为 IA 和 IB。

标签: osgi apache-karaf declarative-services


【解决方案1】:

根据您提供的示例代码,C 在出现 AB 之前不会被激活,因为对 AB 的引用是静态的强制引用。所以开始订购是不相关的。

此外,参考是按照它们在组件描述 XML 中的写入顺序设置的。当 Bnd 将注解处理成组件描述 XML 时,它按照引用名称的顺序写出引用。引用名称可以显式设置,默认为注解成员的名称。因此,在您的示例代码中,a 位于 doRegister 之前,因此字段 a 将在调用 doRegister 之前设置。

我的猜测是,在您努力将实际代码简化为此示例时,您丢失了一些重要信息来理解您的问题。这将包括您的引用的静态/动态和强制/可选性质以及引用名称。

【讨论】:

  • 更新:我已经更新了示例程序,提供了有关参考注释和正确使用接口的更多详细信息。
  • ReferenceCardinality.MULTIPLE 是 0..n。因此,如果组件 C 在组件 B 之前开始,则 C 对 be 的引用将很高兴由零个 B 来满足。此外,如果您查看为组件 C 生成的组件描述 XML,您应该会看到字段 A 的引用元素位于绑定方法 doRegister 的引用元素之前。这意味着 A 将在 B 被绑定并调用 doRegister 之前被绑定并字段一个集合。
猜你喜欢
  • 2012-04-27
  • 1970-01-01
  • 2014-03-16
  • 2017-06-05
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
相关资源
最近更新 更多