【发布时间】: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 为空)。
我尝试了以下方法:
- 将 A 的起始级别设置为低于 B... 无效
- 在工作列表中提取 B 的注册,并在稍后激活 C 时实际使用 A。没用,代码很乱。
- 已通过 doRegister 上的注释寻找一种方法来编写此要求 - 不可能。
- 我尝试使用服务定位器并通过 C 上的 activate 方法获取上下文 - 不起作用,它使 Karaf 崩溃。
我肯定错过了什么,有没有人遇到过类似的问题并找到了解决方案?
更新: 参考 A a 更改为 IA a。添加了关于参考 B() 的遗忘信息。
【问题讨论】:
-
您的示例课程是否完整?是否可能 B 实现和接口而 A 没有?
-
感谢您的指出。但是是的,A、B 和 C 由接口支持,问题仍然存在。
-
你能把一个完整的小例子发到 github 或类似网站吗?
-
这个例子是一个更大的代码库的一部分,所以我在提炼这个例子时遇到了一些问题。
-
你确定这是正确的吗?当您注入未注册为服务的 A 和 B 时,服务将注册为 IA 和 IB。
标签: osgi apache-karaf declarative-services