OSGi:当某项服务可用时,DS服务消费者会同步得到通知

时间:2016-09-08 14:30:31

标签: java osgi declarative-services

我有一个IFoo界面的DS服务使用者:

@Component
public class IFooListener {

    @Reference(bind = "bind",
               unbind = "unbind",
               referenceInterface = IFoo.class,
               cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
               policy = ReferencePolicy.DYNAMIC)
    public static final Map<String, IFoo> allServices = new ConcurrentHashMap<>();

    protected void bind(IFoo service, Map<String, String> properties) {
    ....
    }
    ....
}

我的IFoo服务注册如下:

BundleContext ctx = FrameworkUtil.getBundle(IFooListener.class).getBundleContext();
Properties properties = new Properties();
....
ServiceRegistration managementSrv = ctx.registerService(IFoo.class.getName(), iFooImpl, properties);

我想知道的是,当ctx.registerService(...)方法返回时,是否可以保证当时已经可用的所有DS使用者都会收到IFoo服务已注册的通知? 这是osgi实现特定的东西吗?或者这是DS规范的一部分吗?

1 个答案:

答案 0 :(得分:1)

我在规范中找不到确切的答案。但是,我刚检查了Felix SCR的代码,我发现它没有打开新的线程。它实现了ServiceListener接口(因为它总是必须处于最深层次),幸运的是ServiceListener的javadoc说同时调用了addsService。

简而言之:在Felix SCR中同步调用bind方法。