处理动态添加服务的最佳方法

时间:2016-08-04 19:37:53

标签: osgi declarative-services

我有这个组件(伪代码):

@Component
class ServiceComponent {
  Set<MyService> set = synchronizedSet();

  @Activate
  activate(){... process set...}

  @Reference
  addService(MyService service){set.add(service)}
}

现在,最初,当组件被激活时,它将添加所有可用的MyService实例。但是,如何在激活组件后最好地处理添加项?

2 个答案:

答案 0 :(得分:0)

实际上,您编写的代码只会获得MyService的单个实例,因为默认情况下引用的基数为1..1。

要绑定到所有实例,请按如下所示更改引用声明:

@Reference(cardinality = ReferenceCardinality.MULTIPLE,
           policy = ReferencePolicy.DYNAMIC)
void addService(MyService service) {
    set.add(service);
}

请记住,此方法可以在activate()方法之后甚至在dependencyManagement方法中调用。

答案 1 :(得分:0)

在最新版本的DS中,您可以进行字段注释。如果您将字段指定为volatile,则在新服务输入时将更新该字段。

 @Reference
 volatile Set<MyService>   services;