我有一个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规范的一部分吗?
答案 0 :(得分:1)
我在规范中找不到确切的答案。但是,我刚检查了Felix SCR的代码,我发现它没有打开新的线程。它实现了ServiceListener接口(因为它总是必须处于最深层次),幸运的是ServiceListener的javadoc说同时调用了addsService。
简而言之:在Felix SCR中同步调用bind方法。