【问题标题】:OSGi Declarative Services in Eclipse, multiple service interfaces, and Thread SafetyEclipse 中的 OSGi 声明式服务、多个服务接口和线程安全
【发布时间】:2019-11-26 07:07:08
【问题描述】:

我刚刚在我的代码中偶然发现了一个现象,归结为:

我有一个 OSGi 声明式服务,提供两个配置如下的服务接口:

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="dispose" enabled="true" name="redacted.redactedstore">
   <implementation class="redacted.RedactedStore"/>
   <service>
      <provide interface="redacted.IRedactedStore"/>
      <provide interface="redacted.IRedactedStoreControl"/>
   </service>
</scr:component>

在我的代码中,我有两个不同的线程,它们都打开一个ServiceTracker 来获取服务实例,但是通过不同的接口:

tracker = new ServiceTracker<>(getBundle().getBundleContext(), <serviceClass>.class, null);
tracker.open();
tracker.waitForService(1000l);

所以一个线程使用IRedactedStore作为服务类,另一个使用IRedactedStoreControl作为服务接口。

所以似乎发生的情况是,当两个线程在正确的时间并行运行时,Equinox SCR 将实例化的不是一个(如我所料)而是两个组件实现类的实例。

这种行为正确吗?或者这是 OSGi 的 Equinox 实现中的错误?

如果行为正确,我可以在我的代码中做些什么来通过另一种方式配置服务来防止这种情况发生吗? (当然我可以重构服务,让它只提供一个接口,或者我可以同步服务跟踪器......)

【问题讨论】:

    标签: java osgi eclipse-rcp equinox declarative-services


    【解决方案1】:

    对于非原型范围的组件,我希望它只创建一次。 见declarative services spec

    如果此问题仅在服务跟踪器并行运行时发生,那么我怀疑这可能是 Equinox scr 中的并发问题。

    【讨论】:

    • 正确,应该是一个服务对象注册在两个服务名下。
    • 谢谢,我会尝试用一个最小的例子重现它并提交一个错误。
    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    相关资源
    最近更新 更多