Java OSGi声明性服务的绑定顺序

Java OSGi声明性服务的绑定顺序,java,osgi,declarative-services,Java,Osgi,Declarative Services,假设我使用OSGi声明性服务,并且我有一个具有policy=dynamic的大量引用的服务 A-强制一元 B-强制一元 C-强制倍数 D-可选的一元数 E-可选多个 当我的服务启动时,所有引用都可用。 有没有办法控制在中调用什么顺序绑定 我想让B先绑定,然后对传入的每个E做些什么,但我无法确保B在E之前绑定 是的,更合乎逻辑的方法是让表示B的服务也绑定到E,并执行它应该执行的任何操作,但我不能修改B,我只能使用它。如果我做了一个新的服务,只绑定到B和E,我仍然会有同样的问题 当所有内容都绑定时,

假设我使用OSGi声明性服务,并且我有一个具有policy=dynamic的大量引用的服务

A-强制一元

B-强制一元

C-强制倍数

D-可选的一元数

E-可选多个

当我的服务启动时,所有引用都可用。 有没有办法控制在中调用什么顺序绑定

我想让B先绑定,然后对传入的每个E做些什么,但我无法确保B在E之前绑定

是的,更合乎逻辑的方法是让表示B的服务也绑定到E,并执行它应该执行的任何操作,但我不能修改B,我只能使用它。如果我做了一个新的服务,只绑定到B和E,我仍然会有同样的问题

当所有内容都绑定时,我可以在activate方法中执行我需要执行的任何操作,然后在绑定其他(动态)E时执行,但我想知道是否还有其他方法…

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


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

Ah,这是可行的。谢谢我猜强制性的_倍数加上策略静态是其中一种“永远不要使用”的东西?基本上是的。使用静态策略,DS将不得不在每次服务出现或消失时销毁并重新创建您的组件。事实上,出于这个原因,它永远不会告诉您稍后会有新的服务到达,除非您使用DS 1.2中添加的新“贪婪”策略选项。我对felix的观察是,即使B使用“静态”策略,E使用“动态策略的多个/可选”,@Reference注释在类中的放置顺序也是如此(以及服务描述符中的标记)-很重要。如果对E的引用出现在B之前,则E将被绑定first@mdzh这与我所说的并不矛盾:静态策略字段是在激活之前绑定的。