具有声明性服务的多个引用和依赖性

时间:2017-08-07 09:02:31

标签: osgi apache-karaf declarative-services

我遇到通过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上的激活方法获取上下文 - DID NOT WORK,它崩溃了Karaf。
  5. 我必须清楚地遗漏一些东西,是否有人遇到类似的问题并找到了解决方案?

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

1 个答案:

答案 0 :(得分:0)

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

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

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