Eclipse 中的 OSGi 声明式服务、多个服务接口和线程安全

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


我有一个 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 实现中的错误?


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


肥皂起泡泡
浏览 103回答 1
1回答

当年话下

对于非原型范围组件,我希望它只创建一次。请参阅声明性服务规范。如果此问题仅在服务跟踪器并行运行时发生,那么我怀疑它可能是 equinox scr 中的并发问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java