【问题标题】:Bind order of OSGi declarative servicesOSGi 声明式服务的绑定顺序
【发布时间】:2013-07-10 16:09:45
【问题描述】:

假设我使用 OSGi 声明式服务并且我有一个服务,该服务有一个带有 policy = dynamic 的数字引用...

A - 强制一元。

B - 强制一元。

C - 强制倍数。

D - 可选的一元。

E - 可选倍数。

当我的服务启动时,所有引用都可用。 有什么方法可以控制调用绑定的顺序吗?

我想先绑定 B 并对进来的每个 E 做一些事情,但我无法确保 B 在 E 之前绑定。

是的,更合乎逻辑的做法是让代表 B 的服务也绑定到 E 并做它应该做的任何事情,但我不能修改 B,我只能使用它。如果我创建一个只绑定到 B 和 E 的新服务,我仍然会遇到同样的问题。

当一切都被绑定时,我可以在 activate 方法中做任何我需要做的事情,然后在绑定额外的(动态)E 时做它,但我想知道是否还有其他方法......

【问题讨论】:

    标签: java osgi declarative-services


    【解决方案1】:

    使引用 B 使用“静态”策略,确保在调用 activate 方法之前将其绑定。

    如果使用“动态”策略将引用 E 声明为多个/可选(当您有多个引用时,这几乎是唯一合理的选择),那么只要发布/取消发布服务,它将被绑定/取消绑定.这可以在任何线程中发生,甚至可以在调用 activate 方法期间发生(多次!)。

    【讨论】:

    • 啊,那行得通。谢谢!我猜mandatory_multiple 与策略静态相结合是那些“永远不要使用”的东西之一?
    • 基本上是的。使用静态策略,每次服务出现或消失时,DS 都必须销毁并重新创建您的组件。事实上,由于这个原因,它永远不会告诉您稍后会出现新服务,除非您使用 DS 1.2 中添加的新“贪婪”策略选项。
    • 我对 felix 的观察是,即使 B 使用“静态”策略,E 使用“多重/可选的动态策略”,@Reference 注释在类中的放置顺序(以及 服务描述符中的标签) - 很重要。如果 E 的引用出现在 B 之前,则 E 将首先绑定
    • @mdzh 这与我所说的并不矛盾:静态策略字段在调用激活之前绑定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2010-09-23
    • 2012-04-27
    • 1970-01-01
    • 2018-05-20
    • 2011-11-16
    • 2019-08-05
    相关资源
    最近更新 更多